有一个比较好的方式来使用DI方法处理条件子工厂。场景是注入到entry中的loader对象取决于该entry的设置。最初我是将IoC容器注入到工厂中,并根据命名约定进行解析。然而,我真的很想保持工厂干净而不涉及容器。
工厂被注入到一个类中,该类将从数据库加载所有设置,然后使用工厂创建一组entry。设置确定在给定entry内部将使用哪个loader。
编辑:更改代码以更好地突出实际问题。问题在于必须同时支持多个数据库管理器,如果不是这种情况,那就很简单了。数据库管理器类型由存储在特定entry的设置确定。
工厂被注入到一个类中,该类将从数据库加载所有设置,然后使用工厂创建一组entry。设置确定在给定entry内部将使用哪个loader。
编辑:更改代码以更好地突出实际问题。问题在于必须同时支持多个数据库管理器,如果不是这种情况,那就很简单了。数据库管理器类型由存储在特定entry的设置确定。
public class Entry : IEntry
{
private ISomething loader;
public Entry(ISomething something)
{
this.loader = something;
}
}
public class EntryFactory : IEntryFactory
{
IEntry BuildEntry(IEntrySetting setting)
{
//Use setting object to determine which database manager will be used
}
}
public class EntryManager
{
public EntryManager(IEntryFactory entryFactory)
{
var entrySettings = this.settings.Load();
foreach(var setting in entrySettings)
{
this.entries.Add(entryFactory.BuildEntry(setting));
}
}
}
我曾考虑将子工厂注册到主工厂并以这种方式解决它们,但我不知道是否有更好的方法。