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

Я использую MvcContrib для внедрения зависимостей контроллера Spring.Net ASP.Net MVC. Мои зависимости не внедряются в мой фильтр действий CustomAttribute. Как я могу получить свои зависимости в нем?

Скажем, у вас есть ActionFilter, который выглядит так:

public class CustomAttribute : ActionFilterAttribute, ICustomAttribute
{
    private IAwesomeService awesomeService;

    public CustomAttribute(){}

    public CustomAttribute(IAwesomeService awesomeService)
    {
          this.awesomeService= awesomeService;
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
         //Do some work
    }
}

С разделом конфигурации Spring.Net, который выглядит так:

<object id="CustomAttribute " type="Assembly.CustomAttribute , Assembly" singleton="false">
    <constructor-arg ref="AwesomeService"/>
</object>

И вы используете атрибут так:

[Custom]
public FooController : Controller
{
    //Do some work
}

person Jack    schedule 02.12.2009    source источник


Ответы (1)


Сложность здесь заключается в том, что экземпляры ActionFilters, кажется, создаются новыми с каждым запросом и в контексте, который находится за пределами того, о чем знает Spring. Я обрабатывал те же ситуации, используя класс Spring «ContextRegistry» в моем конструкторе ActionFilter. К сожалению, он вводит в ваш код использование специфичного для Spring API, чего рекомендуется избегать, если это возможно.

Вот как выглядит мой конструктор:

public MyAttribute()
{
    CustomHelper = ContextRegistry.GetContext().GetObject("CustomHelper") as IConfigHelper;
}

Имейте в виду, что если вы загружаете несколько контекстов Spring, вам нужно будет указать, какой контекст вы хотите использовать в методе GetContext(...).

person brow-cow    schedule 23.12.2009
comment
Это единственный способ, которым я смог это сделать, поскольку большинство сценариев внедрения начинаются с контроллера. Вы можете установить DependencyResolver по умолчанию в MVC для использования Spring на основе того, что вам нужно реализовать... это сохранит код, специфичный для Spring, за пределами ваших атрибутов. - person Pharcyde; 14.02.2012