Как сделать внедрение Spring.NET DI в фильтры действий (ASP.NET MVC 3) - PullRequest
2 голосов
/ 29 сентября 2011

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

С 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 ActionFilters

Spring.Net и инъекция атрибутов

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

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

EDIT:

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

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

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

EDIT2:

@ Андреас: Извините за поздний ответ. Но у моего 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;

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

1 Ответ

1 голос
/ 05 октября 2011

В версии 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

...