Внедрение зависимостей / свойств в asp.NET MVC 2 ActionFilter: Помогите! - PullRequest
1 голос
/ 09 апреля 2011

Я пытался обернуть голову вокруг тем, опубликованных по этому вопросу:

Можно ли использовать Dependency Injection / IoC в ASP.NET MVC FilterAttribute?

Впрочем, я просто никуда не денусь.Не говоря уже о том, что все решения имеют зависимости от других библиотек, которые я не могу использовать (MvcContrib, Unity).

Может ли кто-нибудь собрать вместе некоторый код, чтобы объяснить, как заставить это свойство внедряться?Или есть ли другой способ сделать это?

Большое спасибо!

Соответствующий код 1: Контроллер

namespace TxRP.Controllers
{
    [GetMasterPageData] 
    public class BaseController : Controller
    {
    }
}

Соответствующийкод 2: ActionFilter

public class GetMasterPageData : ActionFilterAttribute
{
    private IEmployee emp; //<--Need to inject!
    private ICache cache;  //<--Need to inject!

    /// <summary>
    /// ActionFilter attribute which inserts the user name, access level and any error/warning messages to the MasterPage
    /// Session variables which are consumed primarily by the LogOnUserControl.
    /// The MasterPage will display any warning or error messages.
    /// </summary>
    /// <param name="filterContext"></param>
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
                 //Code
    }

1 Ответ

5 голосов
/ 09 апреля 2011

Невозможно использовать DI с атрибутами, потому что они статически скомпилированы в ваши классы, поэтому ничто не может быть введено . Некоторые люди могут сказать вам, что вы можете использовать своего рода статическую фабрику для получения ваших зависимостей, но это не инъекция зависимостей - это будет Расположение службы - это анти-шаблон .

Тем не менее, можно комбинировать DI с фильтрами действий, если вы отказываетесь от идеи атрибутов , но не особенно легко. Вам нужно будет создать собственный IActionInvoker, хотя самый простой способ сделать это - извлечь из ControllerActionInvoker и переопределить его метод GetFilters. Вот сообщение в блоге , в котором объясняется, как это сделать для обработки ошибок - вы должны иметь возможность экстраполировать это.

Когда вы устали от этого, я бы посоветовал вам переключиться на составление сквозных задач из декораторов и других шаблонов проектирования . Таким образом, вы можете реализовать свои сквозные задачи независимо от технологии ограничения .

...