2012-03-07 115 views
2

不知道如何实现这样的场景:C#建筑 - 设计模式

我有一个基类让我们说

public abstract class ConfigurationBase 
    { 
    public int Id {get; set;} 

    public string Name {get; set;} 

    } 

和几个派生类

public class Config1 : ConfigurationBase 
    { 
    public string Url {get;set;} 
    public string ReferrerUrl {get; set;} 
    } 


    public string Config2 : ConfigurationBase 
    { 
    public string Domain {get; set;} 
    public bool AllowCookie {get; set;} 
    } 

ConfigurationService它得到用不同的参数调用。

的想法是,根据参数范围内构建配置Config1或配置Config2或实例等

所以,问题是怎么能这样用代码来实现?

根据相同的条件,实例化某种类型。

到目前为止,一种想法或者我们如何做到这一点,就是将完全限定类型存储在数据库中并通过反射进行构建。

我有点不愿意使用这种方法,我问是否还有其他答案。

+0

为什么不去功能性编程?这是多么无聊的继承东西:) – Yavar 2012-03-07 09:53:10

+0

对不起,但问题标题 - '架构设计模式'获得了太多的关注。只是“设计模式”会对问题的要求做更多的公正。 – 2012-03-07 10:26:28

回答

1

如果你拥有所有的ConfigurationBase通过实例化他们的子类和规则的知识都是一样的,那么你应该寻找一个Factory模式。

如果您不具备所有子类的知识,那么您需要从数据存储库(不一定是数据库)中动态获取类型并在运行时对其进行实例化。

如果您不知道实例化对象的所有规则,则需要从数据存储中提取规则并执行它们。

很明显,越是动态,你就越需要处理更复杂的事情。

2

工厂模式如何?

编辑:意识到你不想保留单独的方法,在这种情况下,你将需要一个枚举(至少)+一个(丑)方法接受所有可能的参数(即表中的列)

public class ConfigurationService { 

     private ConfigurationBase CreateConfig1(string id, string name, string url, string referenceUrl){...} 

     private ConfigurationBase CreateConfig2(string id, string name, string domain, bool allowCookie){...} 

     public ConfigudationBase CreateConfig(string id, string name, string domain, bool allowCookie, string url, string referenceUrl, ConfigType configTypeEnum){ 
      //call the expected factory method based on enum type. 
     } 
    } 
+1

如果因子方法的签名发生变化,我会使用方法重载并调用简单的CreateConfig方法。无论如何+1 – dowhilefor 2012-03-07 09:47:46

4

我认为正确的方法是创建一个factory class,处理创建您的配置对象:

public class ConfigurationFactory { 
    public ConfigurationBase GetConfig(object[] parameters) 
     // Build your objects here according to your params... do stuff... 
     if (parameters[0] ...) 
      return new Config2(...); 
     elseif ... 
      return new Config1(...); 
    } 
} 

然后调用该方法与参数

ConfigurationFactory factory = new ConfigurationFactory(); 
ConfigurationBase config = factory.GetConfig(parameters); 

即使这种方法需要知道如何创建不同的物体,它只集中在一个地方,因此可以很容易地进行更改。

另外,您可能需要定义一个更通用的接口来定义如何获取配置数据,以便在不知道具体类型的情况下处理对象。

希望帮助

1

一个相当奇怪的想法:)所以不要怪我,是建立一个不同参数类型的哈希值并存储哈希值和特定配置类型的内部字典。所以工厂方法可以是params,然后建立散列值,从字典create中检索配置类型并使用反射传递参数并返回它。

我不得不说,我的所有想法都围绕着反射来解决:)

+0

反思可能确实是解决这类复杂问题的方法。 – 2012-03-07 09:52:51

+0

是的,但这个问题不是那么复杂......而是相当普遍。 – 2012-03-07 09:54:18

+0

我个人使用反射,即使是简单的任务和问题。我只是确保它在一个地方,它不会影响性能。就像“每一帧”或“内循环”或循环。如果是在加载内容的时候,或者在后台加载,那么更简单的方法就会超过可能的小性能命中率。 – dowhilefor 2012-03-07 09:56:49