Внедрение свойства Autofac для объектов, созданных вручную - PullRequest
0 голосов
/ 06 февраля 2019

Предположим, у меня есть следующее:

public class Test
{
    public IDependency Dependency { get; set; }
}

IDependency и Test зарегистрированы в моем сборщике Autofac.Мое разрешение IDependency работает нормально, но я пытаюсь добиться того, чтобы иметь возможность возвращать новые экземпляры Test в коде (например, return new Test();) и иметь его свойства IDependency, предварительно заполненные Autofac.

То, что я пробовал в своем контейнере:

builder.Register(x => new Test {
    x.Resolve<IDependency>()
}); 

Однако каждый раз, когда я new Test() в коде, это свойство IDependency равно null.Это возможно?

( для справки, мой ход мыслей, приведший к этой попытке, заключался в том, что я сначала делал инъекцию конструктора для Test, но затем понял, что в некоторых случаях мне нужно вручную создавать new Test() экземпляры вкод, и не мог понять, что поставить, чтобы удовлетворить сигнатуру конструктора public Test(IDependency dependency) и все еще иметь Autofac для разрешения этой зависимости )

1 Ответ

0 голосов
/ 07 февраля 2019

Просто мысль - вы говорите, что вам нужен какой-то механизм для программного создания нового экземпляра объекта Test (с введенными зависимостями) в вашем коде?

В Autofac есть удобная функция, позволяющаяполучить фабрику для зарегистрированного типа.Я бы посоветовал вам вернуться обратно к инжектору конструктора:

public class Test
{
    public Test(IDependency dependency)
    {
        Dependency = dependency;
    }

    public IDependency Dependency { get; }
}

, а затем зарегистрировать типы в Autofac как:

cb.ResisterType<MyDependency>().As<IDependency>();    
cb.RegisterType<Test>();

Тогда все, что вам нужно делать, где вы хотитевручную создать новый экземпляр Test (), запросив Func<Test> в вашем конструкторе.Autofac сгенерирует фабрику, позволяющую вам создавать экземпляры класса Test в любое время ... но без тесной связи с библиотекой Autofac:

public class SomeAppLogic
{
    public SomeAppLogic(Func<Test> testFactory)
    {
        // Some app logic
        for (int i = 0; i < 10; i++)
        {
            // Invoke the testFactory to obtain a new instance 
            // of a Test class from the IoC container
            Test newTestInstance = testFactory.Invoke();
        }
    }
}

Autofac именует это как «Динамическое создание экземпляров», которое рассматривается здесь.: https://autofaccn.readthedocs.io/en/latest/resolve/relationships.html#dynamic-instantiation-func-b

...