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;}
   }

以及用不同参数调用的CCD_ 1。

想法是根据参数范围来构造Config1或Config2等的实例。

所以问题是如何在代码中实现这一点?

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

到目前为止,我们的一个想法或方法是将要实例化的完全限定类型存储在数据库中,并通过反射来构造它。

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

我认为正确的方法是创建一个工厂类来处理配置对象的创建:

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);

尽管这种方法需要了解如何创建不同的对象,但它只集中在一个地方,因此可以很容易地进行更改。

此外,您可能希望定义一个更通用的接口来定义如何获取配置数据,这样您的对象将更容易处理,而不需要知道它们的具体类型。

希望对有所帮助

工厂模式怎么样?

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

 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.
         }
    }

如果您了解ConfigurationBase的所有子类,并且实例化它们的规则是相同的,那么您应该查看Factory模式。

如果您不了解所有的子类,那么您需要从数据存储(不一定是数据库)中动态地拉入类型,并在运行时实例化它。

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

显然,你做得越有活力,你就必须处理得越复杂。

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

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

最新更新