Pergunta

Eu tenho um costume simples FilterAttribute que eu uso decorar vários ActionMethods.

por exemplo.

[AcceptVerbs(HttpVerbs.Get)]
[MyCustomFilter]
public ActionResult Bar(...)
{ ... }

Agora, gostaria de adicionar alguns registros a esta ação do Filter Custom. Então, sendo um bom garoto, estou usando DI/IoC ... e, como tal, deseja usar esse padrão para o meu costume FilterAttribute.

Então, se eu tiver o seguinte ...

ILoggingService

e desejo adicionar isso meu costume FilterAttribute .. Não tenho certeza de como. Tipo, é fácil para mim fazer o seguinte ...

public class MyCustomFilterAttribute : FilterAttribute
{
    public MyCustomFilterAttribute(ILoggingService loggingService)
    { ... }
}

Mas os erros do compilador dizendo o atributo que decora meu ActionMethod (listado acima...) requer 1 arg .. então não tenho certeza do que fazer :(

Foi útil?

Solução

Eu tenho injeção de propriedade trabalhando com Ninject e a Ninject.web.mvc.

Contanto que você tenha a fábrica do controlador em Ninject.web.mvc, é bastante simples.

Por exemplo

public class EventExistsAttribute : FilterAttribute, IActionFilter
{
    [Inject]
    public IEventRepository EventRepo { private get; set; }

    public void OnActionExecuting(ActionExecutingContext filterContext)
    {
        //Do stuff
    }

    public void OnActionExecuted(ActionExecutedContext filterContext)
    {
        //Do something else if you so wish...
    }
}

Ele tem a desvantagem de ter essencialmente uma dependência 'oculta', por assim dizer ... mas não há muito que você possa fazer sobre isso.

HTHS,
Charles

Outras dicas

Você precisa escrever sua própria injeção de propriedades e fazer injeção de propriedade. Dê uma olhada em isto Post de Jimmy Bogard para idéias.

Sim, é possível usar a injeção de dependência em um filtroTtribute. No entanto, não é possível usar a injeção do construtor em um filtroTtribute. Isso não é uma limitação do ASP.NET MVC, é comum a todos o código .NET, como Os valores transmitidos para um constitutor de atributos são limitados a tipos simples.

[MyFilter(ILogger logger)] // this will not compile
public ActionResult Index()
{
    return View();
}

Portanto, a prática comum é tornar a dependência um propriedade do seu filtro, como no exemplo de @Charlino. Você pode usar a injeção de propriedade. Você pode usar o Ninject para decorar a propriedade Filter, como no exemplo de @Charlino. Ou como sugerido por @mrydengren, você pode fazer isso em uma subclasse personalizada do ControllerActionInVoker.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top