C#体系结构-设计模式

C#体系结构-设计模式,c#,algorithm,C#,Algorithm,不确定如何实现此场景: 比如说,我有一个基类 public abstract class ConfigurationBase { public int Id {get; set;} public string Name {get; set;} } 和几个派生类 public class Config1 : ConfigurationBase { public string Url {get;set;} public st

不确定如何实现此场景:

比如说,我有一个基类

   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等的实例

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

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

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


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

工厂模式如何

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


我认为正确的方法是创建一个用于处理配置对象创建的:

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);
尽管这种方法需要了解如何创建不同的对象,但它只集中在一个地方,因此很容易更改

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


希望这对您有所帮助

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

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

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

很明显,动态性越强,处理起来就越复杂。

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


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

如果factor方法的签名发生了变化,我会使用方法重载并调用简单的CreateConfig方法。无论如何+1反射可能确实是解决这类复杂问题的一种方法。是的,但这个问题并没有那么复杂。。。就我个人而言,即使是简单的任务和问题,我也会使用反思。我只是确保它在一个不会影响性能的地方。就像“每一帧”或“内部循环”或所有循环。如果是在加载某个东西时,或者在后台,那么更简单的方法可能会对性能造成较小的影响。@T.Fabre:我没有很好地表达自己:我的意思是更复杂的问题,但这类问题。@AlexandreC。哦,好吧,我以为你在谈论眼前的问题。。。我个人也使用了很多系统。当我需要编写非常通用的代码时,我会进行反射。你为什么不使用函数式编程呢?所有这些继承的东西有多无聊:)对不起,但是题为“架构设计模式”的问题得到了太多的关注。仅仅“设计模式”就可以更公正地回答问题的要求。
ConfigurationFactory factory = new ConfigurationFactory();
ConfigurationBase config = factory.GetConfig(parameters);