Frage

Ich habe eine einfache benutzerdefinierte FilterAttribute bekam, die ich verzieren verschiedene ActionMethods verwenden.

zB.

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

Nun mag ich einige Protokollierung dieser Custom Aktion hinzuzufügen .. so ein guter Junge zu sein, ich bin mit DI/IoC ... und als solchen Wunsch, dieses Muster für meinen benutzerdefinierten FilterAttribute verwenden.

Also, wenn ich die folgende ...

haben
ILoggingService

und Wunsch, diese meine Gewohnheit FilterAttribute hinzuzufügen .. Ich bin nicht sicher, wie. Wie, es ist einfach für mich, die folgenden ...

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

Aber der Compiler-Fehler das Attribut zu sagen, die meine ActionMethod ziert (siehe oben ...) erfordert 1 arg .. also ich gerade bin nicht sicher, was zu tun ist: (

War es hilfreich?

Lösung

Ich habe Injektion bekommt Eigentum Arbeit mit Ninject und dem Ninject.Web.MVC .

Solange Sie die Controller Fabrik von Ninject.Web.MVC haben, es ist ziemlich einfach.

z.

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...
    }
}

Es hat den Nachteil, im wesentlichen eine ‚versteckte‘ Abhängigkeit, so zu sagen ... aber es gibt nicht viel Sie dagegen tun können.

HTHS,
Charles

Andere Tipps

Sie müssen Ihre eigenen IActionInvoker schreiben und Eigentum Injektion zu tun. Werfen Sie einen Blick auf dieser Beitrag von Jimmy Bogard für Ideen.

Ja ist es möglich, Dependency Injection auf einem FilterAttribute zu verwenden. Allerdings sollte man nicht Konstruktor Injektion auf einem FilterAttribute zu verwenden. Dies ist keine Einschränkung von ASP.NET MVC, es ist eine, die für alle .NET-Code, wie die Werte in ein Attribut übergab Konstruktor auf einfache Typen beschränkt ist .

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

So ist die gängige Praxis ist, die Abhängigkeit a zu machen Eigenschaft des Filters, wie in @ Charlino Vorbild. Sie können dann Eigenschaft Injektion verwenden. Sie können Ninject verwenden, um die Filtereigenschaft wie in @ Charlino Beispiel zu dekorieren. Oder wie @mrydengren vorgeschlagen, können Sie dies in einer benutzerdefinierten Unterklasse von ControllerActionInvoker.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top