Как вы создаете фабрики для классов с зависимостями - PullRequest
0 голосов
/ 24 июня 2018

Если у меня есть класс, который требует зависимости через его конструктор:

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);
    }
}

Как мне избежать необходимости передавать фабрики зависимостей, необходимых для создания «MyClass» при создании MyClassFactory? Или правильно, что вам нужно передавать фабрики каждой зависимости в фабрику для класса с зависимостями?

P.S. Я планирую сделать фабрики синглетонами, которые создаются во время выполнения и передаются. Также я новичок в Dependency Injection. Пожалуйста, дайте мне знать, если есть лучший способ использовать фабрики с интерфейсами.

1 Ответ

0 голосов
/ 24 июня 2018

Если вы новичок в внедрении зависимостей, я бы сказал: вы не .

Устранение зависимостей и создание подавляющего большинства фабрик является целью поставщика услуг внедрения зависимостей . Вы получаете эту возможность, используя компонент внедрения зависимостей , который кто-то другой написал , например Microsoft.Extensions.DependencyInjection .

В общем случае код приложения просто перечисляет свои зависимости, например, , просто объявляя их в качестве аргументов конструктора. Службам все равно, как они или их зависимости создаются. Одной из ролей внедрения зависимости является инверсия управления , что в народе говорит: не звоните нам, мы позвоним вам . Это особенно касается конструкторов, когда речь идет о внедрении зависимостей.

Как только вы начинаете ломать голову над тем, как создавать или обходить фабрики, вы нарушаете несколько принципов хорошего дизайна.

Ознакомьтесь с внедрением зависимостей в ASP.NET Core на docs.microsoft.com. У него есть более полезные ссылки внизу страницы. Он написан с учетом написания веб-сайтов / приложений ASP.NET Core, но большая часть статьи фактически посвящена принципам современной разработки программного обеспечения (таким как инверсия управления), которые в целом применимы для любого приложения.

...