Autofa c. Io C контейнер с параметрами. Лучшие практики - PullRequest
1 голос
/ 13 марта 2020

После изучения документации Autofa c и некоторых вопросов по стеку

Рекомендации для IO C Контейнер ,

Io C Контейнер. Внедрить контейнер

Я понимаю, что мне нужно поставить контейнер на высокий уровень, и после этого пройти через необходимые классы.

f.ex У меня есть контроллер класса высокого уровня

public class AccountController : Controller
{
    private readonly IUserManager userManager;
    public AccountController(IUserManager userManager) //I configure Global.asax and there will 
    {                                                  //be UserManager class. OK.
        this.userManager = userManager;
    }
}

на нижнем уровне у меня есть класс UserManager с параметром IUnitOfWork. Должен ли я поместить туда новый экземпляр UnitOfWork или сделать это с каким-нибудь контейнером?

public class UserManager : IUserManager
{
    readonly IUnitOfWork _unitOfWork;
    public UserManager (IUnitOfWork unitOfWork)
    {
        this._unitOfWork = unitOfWork;
    }
}

Кусок конфигурации автофа c.

conteinerBuilder.RegisterType<UserManager>().As<IUserManager>()
            .WithParameter("unitOfWork",new UnitOfWork()) //This is what bothers me
                                                          //Like I understand we wanna 
                                                          //work with abstraction not with some 
                                                          //implementations but there I must use 
                                                          //UnitOfWork

Скажите, в какую сторону копать, я полностью сбит с толку. Я буду благодарен за любую помощь. =)

1 Ответ

1 голос
/ 14 марта 2020

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

Вы можете зарегистрировать обе службы следующим образом:

builder.RegisterType<UserManager>().As<IUserManager>();
builder.RegisterType<UnitOfWork>().As<IUnitOfWork>();

Метод WithParameter полезен для некоторых требований, например, когда вам нужны некоторые параметры из конфигурации для создания экземпляра:

builder.RegisterType<XService>()
       .As<Service>()
       .WithParameter("key1", config.GetValue("key1"));

См. Передача параметров в регистр из документации autofa c для получения дополнительной информации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...