不确定如何实施此方案:
我有一个基类让我们说
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 :(得分: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 :(得分:2)
工厂模式怎么样?
编辑:意识到你不想保留单独的方法,在这种情况下你需要一个enum(至少)+一个(丑陋)方法接受所有可能的参数(即表中的列)
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.
}
}
答案 2 :(得分:1)
如果您了解ConfigurationBase
的所有子类,并且实例化它们的规则是相同的,那么您应该查看Factory
模式。
如果您不了解所有子类,则需要从数据存储(不一定是数据库)动态提取类型,并在运行时实例化它。
如果您不知道实例化对象的所有规则,则需要从数据存储中提取规则并执行它们。
显然,你做得越多,你就越需要处理它的复杂性。
答案 3 :(得分:1)
一个相当奇怪的想法:)所以不要责怪我,是建立不同参数类型的哈希值并存储hashvalue和特定Config类型的内部字典。因此工厂方法可以是params
,然后构建哈希值,从字典创建中检索配置类型,并使用反射传递参数并返回。
我不得不说,我的所有想法都围绕着反思来解决:)