2015-05-05 1 views
1

У меня есть это приложение DDD с MVC на презентации с Ninject.ASP.NET MVC 5 Фильтр и Ninject

У меня есть CrossCutting Layer, связывающий инъекции со всех слоев, и он работает как шарм.

Что я не могу сделать, это когда дело доходит до атрибутов фильтра. У меня есть этот фильтр, который проверяет один файл cookie и в зависимости от его значения выполняет запросы в базе данных. С помощью этой архитектуры я просто не могу сделать свой фильтр доступ к моему репозиторию напрямую, это будет неуважительно к методологии, которую я применяю.

У меня есть интерфейс IFooAppService и есть его методы, которые в конечном итоге попадут в репозиторий для запроса данных. Я могу успешно внедрить его в любой конструктор Controller, и он выполнит мой _fooAppService.Query(), но у меня этот XooFilter выше некоторых действий в моем приложении, и я просто не могу передать свой _fooAppService. Вот мой XooFilter:

public class XooFilter : ActionFilterAttribute 
{ 
    private readonly IFooAppService _fooAppService; 

    public XooFilter(IFooAppService fooAppService) 
    { 
     _fooAppService = fooAppService; 
    } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     // LOGIC... 

     var fooValue = _fooAppService.Query(); 

     // MORE LOGIC.. 
    } 
} 

Но, когда я вставляю фильтр выше любого Действие [XooFilter], он не будет работать. Он говорит, что фильтр не имеет конструктора с 0 элементами.

Я просто не могу понять, как это сделать, и сохранить характеристики от DDD и IoC. Я нашел статью ниже, но не мог найти ответ:

Injecting dependencies into ASP.NET MVC 3 action filters. What's wrong with this approach?

+0

[Не вводить зависимость в ваши атрибуты] (https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=98). Период! Сделайте свои [атрибуты пассивными] (http://blog.ploeh.dk/2014/06/13/passive-attributes/) или сделайте свой атрибут [скромным объектом] (http://xunitpatterns.com/Humble%20Object .html), как описано [здесь] (https://stackoverflow.com/questions/29915192/unity-property-injection-on-authorizeattribute/29916075#29916075). – Steven

+0

Что мне делать? Мне нужно обращаться к базе данных каждый раз, когда вызывается эти фильтры. EDIT: Я довольно новичок в IoC и DI приятелях, но у меня есть основы. –

+0

После того, как вы прочтете ссылки и ответьте на них, у вас будет достаточно информации, чтобы принять обоснованное решение о том, как решить вашу проблему. – Steven

ответ

0

Вы можете разрешить ваш сервис таким образом

System.Web.Mvc.DependencyResolver.Current.GetService(typeof (IFooAppService)); 
+0

Это не подход, дружественный к ресурсам. –