【发布时间】:2013-09-26 08:31:49
【问题描述】:
我目前正试图编写一个不依赖于服务位置的工厂类。
我能想到的唯一其他选择是使用构造函数注入来注入所有可能的实例,但这可能会导致意外,因为类是通过引用传递的。 一旦可能的供应商数量增加,它也可能会变得昂贵和混乱。
提供程序本身是完全复杂的类,具有自己的依赖项,因此无法手动构建。
更新的服务位置示例:
public class ProviderFactory : IProviderFactory
{
private readonly IProviderConfigurationService _providerConfigurationService;
public enum SearchType
{
Foo,
Bar
}
public ProviderFactory(IProviderConfigurationService providerConfigurationService)
{
_providerConfigurationService = providerConfigurationService;
}
public Collection<IProvider> GetProviderInstances(SearchType searchType)
{
// Provider configuration service will read a XML/DB store to retrieve list of search providers applicable for a search type
var providerList = _providerConfigurationService.GetProviderList(searchType);
return new Collection<IProvider>(providerList.ForEach(x=> ServiceLocator.GetInstance(typeof(x))).ToList()) ;
}
}
我还有哪些其他选择?我目前正在使用 Unity 进行 DI。
【问题讨论】:
-
为什么首先需要这么多依赖对象?
-
根据搜索类型,我需要调用一组不同的提供程序。一般来说,这也是关于工厂模式的一个有效问题,因为它的工作是创建违反 IoC 原则的具体实例。
-
您使用的是什么 DI 框架? Ninject 有一个工厂扩展,非常适合这个。
-
补充我的评论,简而言之,工厂类将包含为给定搜索类型执行哪些提供程序的业务逻辑。执行提供者和聚合结果的任务留给工厂的消费者。工厂本身将被构造函数注入。
-
@SimonWhitehead 不幸的是,我正在使用 Unity。我已更新问题以反映这一点。
标签: c# inversion-of-control factory service-locator