如何为具有依赖项的类创建工厂

时间:2018-06-23 21:03:56

标签: dependency-injection factory

如果我有一个需要通过其构造函数进行依赖的类:

public MyClass( IDependencyInterface dependency )

并且依赖项使用工厂/构建器(这仍然使我混淆两者之间的区别)来设置其参数:

IDependencyInterface dependency = dependencyFactory
                                       .ChangeSomeParameter(someValue)
                                       .ChangeSomeOtherParameter(someOtherValue)
                                       .Build();

如何在不传入其他工厂实例化所需依赖关系的情况下为MyClass创建工厂?

public MyClassFactory
{
    private SomeParam _someParam;
    private IDependencyFactory _dependencyFactory;

    public myClassFactory( IDependencyFactory dependencyFactory)
    {
        _dependencyFactory = dependencyFactory;
    }

    public ImyClassFactory ChangeSomeParameter(someParam)
    {
        _someParam = someParam;
    }

    public IMyClass Build()
    {
        Dependency dependency = _dependencyFactory
                                   .ChangeSomeParameter( _SomeParam )
                                   .Build();
        return MyClass(dependency);
    }
}

在创建MyClassFactory时,如何避免必须传递建立“ MyClass”所需的依赖项的工厂?还是对,您需要将每个依赖项的工厂传递给具有依赖项的类的工厂?

P.S。我计划使工厂单例在运行时实例化并传递。我也是依赖注入的新手。请让我知道是否有更好的方法通过接口使用工厂。

1 个答案:

答案 0 :(得分:0)

如果您不熟悉依赖项注入,我会说:您不

解决依赖关系并创建绝大多数工厂是依赖注入服务提供商的目的。您可以使用依赖注入组件别人写的来获得此功能,例如Microsoft.Extensions.DependencyInjection

通常,应用程序代码仅列出其依赖项,例如通过仅将其声明为作为构造函数参数。服务不在乎如何创建它们或它们的依赖项。依赖项注入的作用之一是控制权反转,它通常表示不给我们打电话,我们给您打电话。在谈论依赖注入时,这尤其适用于构造函数。

一旦您开始为如何创建工厂或在工厂中走动而挣扎,就会违反良好设计的几项原则。

请参阅docs.microsoft.com上的Dependency injection in ASP.NET Core文章。页面底部有更多有用的链接。它是在编写ASP.NET Core网站/应用程序时编写的,但是实际上,大多数文章都涉及通常适用于任何应用程序的现代软件开发原理(例如控制反转)。