Unity IoC: создание экземпляра интерфейса без внедрения зависимости от конструктора - PullRequest
0 голосов
/ 29 сентября 2018

Я новичок в терминологии Unity и DI, поэтому пытаюсь понять, как это работает.У меня есть следующий код, который реализует DI с использованием контейнера Unity.

public class DashboardService: IDashboardService
{
    private readonly IRepository<USERROLE> repoUserRole;
    private readonly IRepository<INSTITUTION> repoInstitution;

    public DashboardService(
        IRepository<USERROLE> repoUserRole, IRepository<INSTITUTION> repoInstitution)
    {
        this.repoUserRole = repoUserRole;
        this.repoInstitution = repoInstitution;
    }

    public List<USERROLE> GET(List<string> Id)
    {
        // Use repoUserRole object to get data from database
    }
}

Эта служба вызывается контроллером:

public class DashboardController : ApiController
{
    private readonly IDashboardService dashboardService;

    public DashboardController(IDashboardService dashboardService)
    {
        this.dashboardService = dashboardService;
        this.mapper = mapper;
    }

    //Action method which uses dashboardService object
}

Вот конфигурация Unity:

var container = new UnityContainer();

container.RegisterType(typeof(IDashboardService), typeof(DashboardService))
.RegisterType(typeof(IRepository<>), typeof(Repository<>));

return container;

Вопросы:

  1. На данный момент мой код работает нормально, но если я закомментирую конструктор DashboardService, я получу нулевые объекты репозитория.
  2. Я разрешаю зависимости в Unity для интерфейсов репозитория, так почему я получаю нулевое значение там?
  3. Есть ли способ передать зависимость репозитория без использования шаблона конструктора?

1 Ответ

0 голосов
/ 29 сентября 2018

если я закомментирую конструктор DashboardService, я получу нулевые объекты репозитория.

Если вы не добавите конструктор в класс, C # создаст открытый конструктор без параметровдля вас во время компиляции.Это заставляет Unity вызывать этот «невидимый» конструктор без параметров, и поэтому ни одно из ваших закрытых полей не инициализируется.

Чтобы предотвратить подобные случайные ошибки программирования, всегда включайте «обрабатывать все предупреждения как ошибки».на вкладке сборки свойств вашего проекта.Это позволит компилятору прекратить компиляцию, поскольку он обнаруживает эти неинициализированные поля.

Есть ли способ передать зависимость хранилища без использования шаблона конструктора?

Да, есть, но любой другой метод, который вы можете использовать, приводит либо к запаху кода, либо к анти-шаблону.Внедрение в конструктор почти во всех случаях является лучшим решением.

...