1

У меня есть некоторые проблемы с конструкторами в controller и service, которые вызывается controller.ASP.NET MVC и инжекция зависимостей уровня обслуживания

Это моя служба:

// model state dictionary for validation 
private ModelStateDictionary _modelState; 

// initialize UnitOfWork 
private IUnitOfWork _unitOfWork; 

public TownService(ModelStateDictionary modelState, IUnitOfWork unitOfWork) 
{ 
    _modelState = modelState; 
    _unitOfWork = unitOfWork; 
} 

Теперь в моем контроллере, я хочу создать новую услугу, передать контроллер this.ModelState, но не хочу, чтобы добавить UnitOfWork внутри контроллера.

Что-то вроде этого:

private ITownService _townService; 

public TownController() 
{ 
    _townService = new TownService(this.ModelState, null); 
} 

так, что все с учетом UnitOfWork делается внутри службы. Контроллер просто передает свой собственный modelState, и сервис - это тот, который создает новый UnitOfWork.

Возможно ли это, а также хороший способ? Как я могу это достичь? Или я должен добавить new UnitOfWork вместо нулевого параметра в контроллере?

Потому что я хочу, чтобы отделить Core, DAL, Web, насколько это возможно, так что все делает свою часть и с добавлением UnitOfWork как в контроллере и обслуживания похоже, его не хороший способ ...

Спасибо.

ответ

4

Зависимость от инъекций:

Во-первых, вы должны правильно понять концепцию 'Dependency Injection':

public TownController() 
{ 
    _townService = new TownService(this.ModelState, null); 
} 

TownController не получает какую-либо зависимость впрыскивается к ней, и вы создание экземпляра _townService с использованием жесткой кодировки TownService.

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

private ITownService _townService; 

public TownController(ITownService townService) 
{ 
    _townService = townService; 
} 

Как вы можете видеть, ITownService реализация впрыскивается в контроллер (используя конструктор).

Теперь, если вводятся зависимость (ITownService) имеет свой собственный зависимости (IUnitOfWork), это не означает, что контроллер должен получить впрыскивается вся эту зависимость, а также, потому что, когда ITownService вводятся в контроллер, то уже инициализированы, и его зависимости уже были введены в него.

Большинство людей используют Dependency Injection Каркасы для достижения всего этого (и многое другое), вот простой пример Unity для ASP.NET MVC:

// some code omitted for brevity 
internal static class DependencyResolvingConfig 
{ 
    internal static IUnityContainer Configure() 
    { 
     var container = new UnityContainer(); 
     RegisterTypes(container); 
     DependencyResolver.SetResolver(new UnityDependencyResolver(container)); 
     return container; 
    } 

    internal static void RegisterTypes(IUnityContainer container) 
    { 
     container.RegisterType<IUnitOfWork, UnitOfWork>(); 
     container.RegisterType<ITownService, TownService>(); 
    } 
} 

Эта линия:

DependencyResolver.SetResolver(new UnityDependencyResolver(container)); 

говорит ASP.Net MVC, что всякий раз, когда он создает экземпляр нового контроллера с зависимостью, он запросит UnityDependencyResolver, чтобы обеспечить реализацию, Unity выполнит это в соответствии с приведенной выше конфигурацией.

ModelStateDictionary:

Другая проблема заключается в том, что ваш уровень обслуживания использует ModelStateDictionary:

Понятие ModelState есть (в целом) озабоченность презентационного слоя и используется для проверки и получения/установки ошибки обратно/из пользовательского интерфейса (традиционно HTML-формы).

Вы должны проверить и проверить состояние модели в своих контроллерах, а затем (как правило, только если она действительна) вы вызываете уровень сервиса для выполнения фактического действия.

Кроме того, вам необходимо добавить ссылку на System.Web.Mvc Сборка исключительно для использования ModelState (что не рекомендуется).

+0

Хороший ответ :) Я установил свой сервисный слой с DI IUnitOfWork и работает нормально. Однако я хотел бы спросить вас кое-что ... Мне интересно, введен ли IUnitOfWork один сингл? Я хотел бы, чтобы тот же UnifOfWork по всем контроллерам выполнял ту же транзакцию. Я новичок в DI, и я немного запутался ..... – Alvykun

+0

@Alvykun, В случае серверов веб-приложений, «Единица работы» обычно ассоциируется с запросом Http. Большинство фреймворков используют термин «время жизни» или «область» для определения того, как объекты создаются (или используются повторно). Таким образом, ваш желаемый «Singleton» на самом деле был бы своего рода «PerRequestLifeTime» (в Unity, например: https://msdn.microsoft.com/en-us/library/microsoft.practices.unity.perrequestlifetimemanager(v= pandp.30) .aspx) – haim770

+0

благодарит за ответ. «PerRequestLifeTime» находится внутри пакета Unity.Mvc nuget. Я использую Unity, так как мой проект - это веб-api 2. Я обнаружил, что 'PerThreadLifeTimeManager' работает также ... Но я не уверен, что моя настройка IoC правильно выполнена ...' container.RegisterType (новый PerThreadLifetimeManager()); container.RegisterType (новый HierarchicalLifetimeManager()); container.RegisterType (новый HierarchicalLifetimeManager()); ' – Alvykun

 Смежные вопросы

  • Нет связанных вопросов^_^