Внедрение свойств в фильтр действий - PullRequest
5 голосов
/ 07 октября 2010

Я пытаюсь заставить свойство Injection работать над атрибутом фильтра настраиваемых действий. Он работает так, как и должно быть, однако я бы хотел использовать DI для самого свойства. Мой фильтр выглядит так

[AttributeUsage(AttributeTargets.Class)]
public sealed class HeaderFilterAttribute : ActionFilterAttribute
{
    public IMarketService MarketService
    { get; set; }

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        var view = (ViewResultBase)filterContext.Result;

        if (view != null)
        {
            BaseViewModel viewModel = view.ViewData.Model as BaseViewModel;
            if (viewModel != null)
                viewModel.Header = GetHeaderScript();
        }
        base.OnActionExecuted(filterContext);
    }

   private string GetHeaderScript()
   {
     //Use MarketService here and return header script
     return "script";
   }
}

Вот так я настраиваю свойство, используя StructureMap внутри моего класса BootStrapper.

            //HeaderFilterAttribute
        IMarketRepository marketRepository = new SqlMarketRepository();
        IMarketService marketService = new MarketService(marketRepository);
        ObjectFactory.Container.Configure(r => r.ForConcreteType<HeaderFilterAttribute>().
                                          Configure.WithProperty("MarketService").
                                          EqualTo(marketService));

Моя проблема в том, что у меня нет доступа к SqlMarketRepository, поскольку все мои конкретные типы вводятся через DI, и я действительно не хочу использовать конкретные типы в моем загрузчике. Итак, главный вопрос сейчас заключается в том, как мне добавить MarketService в атрибут Filter, не прибегая к описанному выше? :)

Ответы [ 2 ]

4 голосов
/ 07 октября 2010

В вызове ObjectFactory.Initialize () добавьте следующую строку:

SetAllProperties(x => x.OfType<IMarketService>());

, которая вставит сконфигурированный экземпляр IMarketService в любое свойство типа IMarketService для любого объекта, полученного из контейнера.

1 голос
/ 07 октября 2010

Я думаю, вам нужна реализация вызывающего действия, которая разрешит фильтры. Вы можете выкопать образец Виндзора из реализации моей компании (примерно на полпути вниз). Там должно быть несколько доступных в Интернете. Я знаю, что видел некоторые на этом сайте.

PS. Я заметил, что вы используете модель базового представления для заполнения заголовка. Я бы рекомендовал использовать коллекцию ViewData [] со статическим ключом вместо наследования в вашей модели представления. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...