IRepository, IService, Unity в приложении ASP.NET MVC, справочный вопрос - PullRequest
0 голосов
/ 22 октября 2010

Я новичок в Unity, но этот вопрос более общий для IoC, и я довольно новичок в реализации IoC в целом. У меня есть решение VS2010 с этой структурой проекта (слегка упрощено):

  • Бизнес-объекты - папка
    • DomainModel (класс Lib prj.) - сущности Entity Framework 2 POCO
  • Уровень данных - папка
    • DataAccess (класс Lib prj.) - EF2 EDMX
    • Репозиторий (Class Lib prj.) - Интерфейс IRepository и конкретные реализации репозитория
  • Презентационный слой - папка
    • WebUI - MVC Project
  • Сервисный уровень
    • Сервис (Class Lib prj.) - Интерфейс IService и конкретные реализации сервиса (шаблон фасада)

Все ссылки на проект DomainModel.

Репозиторий ссылается на проект DataAccess.

Сервисный уровень ссылается на проект репозитория.

WebUI ссылается на проект службы и сборки Unity.

У меня есть Unity, настроенный на корректное внедрение всех типов моих служб в WebUI (global.asax через пользовательский UnityControllerFactory.cs). Но как мне настроить Unity на сервисном уровне для внедрения объектов репозитория?

Я не хочу ссылаться на проект Repository из WebUI, чтобы гарантировать, что во время разработки не будет ярлыков и обходить слой Service.

Пара идей, которые у меня есть (не уверен, что это решит их):

  1. Переместите интерфейсы IRepository в DomainModel и добавьте вызовы Unity.RegisterType <> для IRepository
  2. Настройка конфигурации Unity в Web.config

Будем весьма благодарны за любые указания, в частности, как настроить Unity для сервисного уровня / репозитория, а также в целом о проекте.

1 Ответ

2 голосов
/ 23 октября 2010

Добавьте какой-нибудь загрузчик в сервисный проект. Затем обратитесь к загрузчику в WebUI.

Один из способов сделать это - написать небольшое расширение Unity. Примерно так:

public class ServiceLayerBootstrap : UnityContainerExtension
{
    protected override void Initialize()
    {
        Container.RegisterType<IRepository, WhateverRepositoryImplementation>();
        // etc.
    }
}

Затем в веб-проекте, в котором вы создаете контейнер и инициализируете его, выполните следующее:

var container = new UnityContainer()
    .AddNewExtension<ServiceLayerBootstrap>();
...