1

IoC 和自动装配让我困扰的是 IoC 对创建的对象的可用性。

假设我有一个静态 Utils 类,它在整个系统中使用。当我决定使用 IoC 和 DI 时,我很容易将 Utils 更改为非静态的,并让我的所有组件都接收它的实例。

但是,自动装配仅适用于在引导期间创建的组件、在运行时创建的对象或作为用户操作的响应以及使用 Utils 的对象,自动装配不起作用。相反,我必须手动将 Utils 的实例传递给在运行时创建的每个对象的每个实例。

我能看到的唯一解决方法是使用传递 IoC 容器的反模式,我当然不想这样做。

还有其他方法吗?或者我是否被迫将 Utils 手动传递给每个实例和类?

注意:这不是设计问题。当然,我可以通过各种方式尽量减少这种隐喻 Utils 的使用,但在许多情况下这是不可避免的。

4

1 回答 1

3

我能看到的唯一解决方法是使用传递 IoC 容器的反模式,我当然不想这样做。

答案很简单:使用抽象工厂。

通过在应用程序中定义工厂接口和在组合根(您的引导程序代码)中定义工厂实现,您可以防止使用服务定位器反模式。这个工厂实现可以持有对容器的引用并调用它来请求实例。因为该实现是您的引导逻辑的一部分,所以该实现是一个基础设施组件,您没有将它用作服务定位器

例子:

public interface IUnitOfWorkFactory
{
    IUnitOfWork CreateNew();
}

在组合根中实现:

internal class SimpleInjectorUnitOfWorkFactory
    : IUnitOfWorkFactory
{
    private readonly SimpleInjector.Container container;

    public SimpleInjectorUnitOfWorkFactory(Container container)
    {
        this.container = container;
    }

    public IUnitOfWork CreateNew()
    {
        return this.container.GetInstance<IUnitOfWork>();
    }
}
于 2012-10-18T12:33:26.393 回答