Как выполнить Spring.NET DI-инъекцию в фильтрах действий (ASP.NET MVC 3)

Пытался искать, но конкретных ответов нет (я в этом новичок) ...

Когда Spring.NET поддерживает ASP.NET MVC 3, как я могу выполнять внедрение зависимостей внутри фильтров действий? Изучал, но понятия не имею! : /

В документальном фильме Spring.NET, похоже, упоминается, что обо всем этом позаботились, все, что нужно сделать, это просто зарегистрировать фильтр действий в контексте Spring, а Spring позаботится обо всем необходимом процессе внедрения.

http://www.springframework.net/doc-latest/reference/html/web-mvc3.html

Однако я просто не могу заставить его работать. Изучая блоги и т. Д., Можно встретить упоминания об использовании поставщиков фильтров или непосредственном использовании ContextRegistry.GetContext (), но, похоже, это не соответствует AOP ..

Использование Spring.Net для внедрения зависимостей в ASP. Фильтры действий .NET MVC

Spring.Net и внедрение атрибутов

Итак, как правильно это сделать? Я думал, что это уже покрыто spring.net, но оказалось, что это не так.

Я сослался на Spring.Web.Mvc3 v4.0.30319, и я работаю на ASP.NET MVC 3.

РЕДАКТИРОВАТЬ:

Я пробовал это:

SpringMvcDependencyResolver dr = 
       new SpringMvcDependencyResolver(ContextRegistry.GetContext()); 

а затем получение службы через dr.GetService<ITestService>();. Кажется, это несколько заставляет ее работать, но вместо получения правильной фактической реализации службы (в моем Filters.xml я написал свойство ref на TestService), она возвращает заглушку версии службы. Я сделал это неправильно? Или мне нужно перебрать и выбрать правильный или что-то еще через GetServices()?

РЕДАКТИРОВАТЬ2:

@Andreas: Извините за поздний ответ. Но у моего Global.asax он есть.

public class MvcApplication : Spring.Web.Mvc.SpringMvcApplication

Чтобы проверить, у меня есть это в моей весенней конфигурации:

<object type="Spring.Mvc3QuickStart.Filters.TestFilter, Spring.Mvc3QuickStart" singleton="false" >
  <property name="Message" value="This is the ActionFilter message" />
</object>

В моем фильтре:

public class TestFilter : ActionFilterAttribute
{
    public string Message { get; set; }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        filterContext.Controller.ViewBag.ActionMessage = Message;
        base.OnActionExecuting(filterContext);
    }
}

В моем контроллере у меня есть это:

ViewData["Message"] = Message;

Итак, чисто для этого тестового проекта в фильтр должно быть введено сообщение. Но результат не такой, как ожидалось.


person RicL    schedule 29.09.2011    source источник
comment
Не могли бы вы опубликовать соответствующие части вашей весенней конфигурации? Фильтр «Внедрение опоры в действие» работает ootb, когда вы получаете свой global.asax из SpringMvcApplication.   -  person Andreas    schedule 01.10.2011
comment
@Andreas: Отредактировано, чтобы ответить на ваши вопросы :) Хм .. не совсем уверен, что мои правки соответствуют тексту, похоже, они плохо отображаются.   -  person RicL    schedule 04.10.2011


Ответы (1)


Версия 1.3.2 Spring.Net.Mvc3 кажется немного ошибочной. В SpringMvcDependencyResolver метод public IEnumerable<object> GetServices(Type serviceType) всегда терпит неудачу. Это должно быть return services.Values.Cast<object>(); вместо return services.Cast<object>();. Самое простое решение - переопределить BuildDependencyResolver из SpringMvcApplication и зарегистрировать собственный фиксированный SpringMvcDependencyResolver.

Я создал полное решение, размещенное здесь: https://gist.github.com/1262927

person Andreas    schedule 04.10.2011
comment
Вы сообщили об этой ошибке и исправили? Думаю, было бы здорово. Spring.net теперь размещен на github. - person Marijn; 05.10.2011
comment
@Marijn: Дело в SPRNET-1473. - person Andreas; 05.10.2011
comment
@Andreas, будет ли это в конце концов означать, что мне все еще нужно использовать GetServices и просеивать IEnumerable? Хм, я путаюсь, лол. Могу я спросить, не могли бы вы предоставить рабочий образец этого? Не могу заставить IApplicationContext и ContextRegistry работать через переопределение ... Мне может не хватать какой-то ссылки. - person RicL; 06.10.2011
comment
Вы найдете полный образец здесь: andreaskluth.net/SpringSample/SpringActionFilterSample.zip - person Andreas; 06.10.2011