通过引入工厂使依赖注入可选?

时间:2011-05-25 07:42:43

标签: c# dependency-injection ioc-container factory

所以我有一个包含早午餐服务类的软件。这些服务通过各自的构造函数来获取一些依赖关系。

我的设计考虑了依赖注入,但是打算在软件之上构建的开发人员可能不想使用DI。因此我实现了IOC容器,因此如果需要,由开发人员引入一个容器。

我的问题是该软件附带了一个使用这些服务的管理网站。 我不想对网站中的服务依赖项进行硬编码,因为我希望开发人员可以根据需要进行切换。

那我该怎么办呢?

我正在考虑为服务引入工厂,并在某处给它一个固定的静态位置。然后在网站上使用它。

public class ServiceFactory : IServiceFactory
{
    public static IServiceFactory Current { get; set; }

    static ServiceFactory()
    {
        Current = new ServiceFactory();
    }

    public TService Create<TService>()
    {
        // Creation logic here.
    }
}

开发人员可以通过将自己的IServiceFactory实现设置为静态ServiceFactory.Current属性来控制事物。

这是要走的路吗?

2 个答案:

答案 0 :(得分:2)

我想注意两件事。

  • 您提出的不是依赖注入,而是服务位置。 They are not the same
  • 理想情况下,依赖注入对开发人员完全透明。即真正的依赖关系通过构造函数进入,而不是通过间接进入。

答案 1 :(得分:1)

你有没有看过CommonServiceLocator图书馆?它被设计为在IOC容器上提供抽象层,但是您可以同样地使用它来描述服务工厂,这样您的应用程序就能够解析其依赖关系而无需知道它们是来自DI还是工厂实施......