design-patterns - 无法结合 Factory/DI

标签 design-patterns dependency-injection

假设我有一些类 Foo,它有两个依赖项:ISerializer<T>IFileAccessHandler .

现在这个类还有其他的依赖,函数依赖。我不希望任何人在无效状态下实例化此类,因此我还需要在构造函数中传递域对象。

但是,当我也知道在实际创建类 Foo 时要传递什么域对象时,如何让 IoC 处理它?

我使域对象成为我由工厂设置的属性。因此,工厂调用服务定位器以获取正确实例化的“Foo”类及其依赖项,并进一步用正确的域对象填充它并返回它。

但这是最好的方法吗?我宁愿让我的构造函数的域对象部分使它变得明显,你实际上需要使用“Foo”。

有任何想法吗?
我在这里错过了什么吗?

最佳答案

当您在注册时无法连接具体类型时,DI 的默认解决方案是使用 。抽象工厂

在您的情况下,我将定义一个 IFooFactory 接口(interface):

public interface IFooFactory
{
    Foo Create(DomainClass dc);
}

这将允许您定义一个了解您的基础设施服务的具体实现。

public class FooFactory : IFooFactory
{
    private readonly ISerializer serializer;
    private readonly IFileAccessHandler fileHandler;

    public FooFactory(ISerializer serializer, IFileAccessHandler fileHandler)
    {
        if(serializer == null)
        {
            throw new ArgumentNullException("serializer");
        }
        if(fileHandler == null)
        {
            throw new ArgumentNullException("fileHandler");
        }

        this.serializer = serializer;
        this.fileHandler = fileHandler;
    }

    public Foo Create(DomainClass dc)
    {
        return new Foo(this.serializer, this.fileHandler, dc);
    }
}

这样你就可以保护不变量 您的 Foo 类,使您能够留在 构造函数注入(inject) .

在 DI 容器中,您可以注册 IFooFactory 和相应的实现。到处都有一个 DomainClass 实例并需要一个 Foo 实例,然后您将依赖 IFooFactory 并使用它。

关于design-patterns - 无法结合 Factory/DI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1926826/

相关文章:

c# - ASP.NET Core 依赖注入(inject),带参数注入(inject)

asp.net-mvc - MVC 存储库模式 - 访问其他存储库

c++ - C++ 中构造函数注入(inject)的高级配置

java - 需要一些有关包装类模式的帮助

angular - 尝试手动注入(inject) NgControl 时出现 Lint 警告 "get is deprecated"

c# - 在自定义 TypeFormatter 中使用 RegisterWebApiRequest 时出现 SimpleInjector.ActivationException

java - 从 HashMap 存储和调用方法

java - 生成器模式: Why Are Many Example Implementations different From the GOF Diagram?

java - 为什么我们需要不可变的类?

database - Data Mapper 可以调用另一个吗?并继承?