У меня есть некоторые проблемы с конструкторами в 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 как в контроллере и обслуживания похоже, его не хороший способ ...
Спасибо.
Хороший ответ :) Я установил свой сервисный слой с DI IUnitOfWork и работает нормально. Однако я хотел бы спросить вас кое-что ... Мне интересно, введен ли IUnitOfWork один сингл? Я хотел бы, чтобы тот же UnifOfWork по всем контроллерам выполнял ту же транзакцию. Я новичок в DI, и я немного запутался ..... – Alvykun
@Alvykun, В случае серверов веб-приложений, «Единица работы» обычно ассоциируется с запросом Http. Большинство фреймворков используют термин «время жизни» или «область» для определения того, как объекты создаются (или используются повторно). Таким образом, ваш желаемый «Singleton» на самом деле был бы своего рода «PerRequestLifeTime» (в Unity, например: https://msdn.microsoft.com/en-us/library/microsoft.practices.unity.perrequestlifetimemanager(v= pandp.30) .aspx) – haim770
благодарит за ответ. «PerRequestLifeTime» находится внутри пакета Unity.Mvc nuget. Я использую Unity, так как мой проект - это веб-api 2. Я обнаружил, что 'PerThreadLifeTimeManager' работает также ... Но я не уверен, что моя настройка IoC правильно выполнена ...' container.RegisterType (новый PerThreadLifetimeManager()); container.RegisterType (новый HierarchicalLifetimeManager()); container.RegisterType (новый HierarchicalLifetimeManager()); ' –
Alvykun