Spring.Net & Внедрение атрибутов - PullRequest
1 голос
/ 03 июля 2011

Я хочу, чтобы зависимость вставляла атрибут в ASP.NET MVC с помощью Spring.Net, мой атрибут выглядит примерно так (обратите внимание, это весь псевдокод, который я только что набрал) ...

public class InjectedAttribute : ActionFilterAttribute
{
    private IBusinessLogic businessLogic;

    public InjectedAttribute(IBusinessLogic businessLogic)
    {
        this.businessLogic = businessLogic;
    }

    public override void OnActionExecuting(ActionExecutedContext filterContext)
    {
        // do something with the business logic
        businessLogic.DoSomethingImportant();
    }
}

Я использую фабрику контроллеров для создания контроллеров, в которые также вводятся различные объекты бизнес-логики. Я получаю контроллеры из контейнера IoC вот так ...

ContextRegistry.GetContext().GetObject("MyMVCController");

Я настраиваю свои контроллеры примерно так, передавая бизнес-логику

<object name="MyMVCController" type="MyMVC.MyMVCController, MyMVC">
    <constructor-arg index="0" ref="businessLogic" />
</object>

Есть ли способ настроить внедрение атрибутов? Я не хочу вкладывать это в мои атрибуты ...

public class InjectedAttribute : ActionFilterAttribute
{
    private IBusinessLogic businessLogic;

    public InjectedAttribute(IBusinessLogic businessLogic)
    {
        this.businessLogic = ContextRegistry.GetContext().GetObject("businessLogic");
    }
    ....

1 Ответ

2 голосов
/ 03 июля 2011

Я настраиваю свои контроллеры примерно так, передавая бизнес-логику

Это определяет контроллеры как синглтоны, что означает, что они будут повторно использоваться среди всех запросов, которые могут быть катастрофическими. Убедитесь, что контроллеры не определены как одиночные:

<object name="AnotherMovieFinder" type="MyMVC.MyMVCController, MyMVC" singleton="false">
    <constructor-arg index="0" ref="businessLogic" />
</object>

Теперь, как говорится, давайте вернемся к основному вопросу об атрибутах.

Поскольку вы хотите добавить конструктор в свои фильтры, вы больше не можете украшать какие-либо контроллеры или действия с ними, поскольку значения атрибутов должны быть известны во время компиляции. Вам нужен механизм для применения этих фильтров во время выполнения к контроллерам / действиям.

Если вы используете ASP.NET MVC 3, вы можете написать пользовательский поставщик фильтров , который будет применять ваш фильтр действий к желаемым контроллерам / действиям, вводя в него зависимости.

Если вы используете более старую версию, вы можете использовать пользовательский ControllerActionInvoker .

...