Question

J'ai simple FilterAttribute personnalisé que j'utilise décorer divers ActionMethods.

par exemple.

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

Maintenant, je tiens à ajouter un peu de l'exploitation forestière à cette action CustomFilter .. afin d'être un bon garçon, j'utilise DI/IoC ... et en tant que tel souhait d'utiliser ce modèle pour mon FilterAttribute personnalisé.

Donc, si je donne les résultats suivants ...

ILoggingService

et que vous souhaitez ajouter ce mon FilterAttribute personnalisé .. Je ne sais pas comment. Comme, il est facile pour moi de faire ce qui suit ...

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

Mais les erreurs du compilateur dire l'attribut qui décore mon ActionMethod (énumérés ci-dessus ...) nécessite 1 arg .. donc je ne suis pas sûr de ce qu'il faut faire: (

Était-ce utile?

La solution

J'ai injection propriété travailler avec Ninject et Ninject.Web.MVC .

Tant que vous avez l'usine de contrôleur de Ninject.Web.MVC, il est assez simple.

par exemple.

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

Il a l'inconvénient d'avoir essentiellement une dépendance « cachée », pour ainsi dire ... mais il n'y a pas grand-chose que vous pouvez faire à ce sujet.

HTHS,
Charles

Autres conseils

Vous devez écrire votre propre IActionInvoker et faire l'injection de la propriété. Jetez un oeil à ce poste par Jimmy Bogard pour des idées.

Oui, il est possible d'utiliser l'injection de dépendance sur un FilterAttribute. Cependant, il ne peut utiliser l'injection de constructeur sur un FilterAttribute. Ce n'est pas une limitation de ASP.NET MVC, il est commun à tout le code .Net, comme les valeurs transmises dans un constuctor attributs sont limités à des types simples .

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

Ainsi, la pratique courante est de faire la dépendance propriété de votre filtre, comme dans l'exemple de @ Charlino. Vous pouvez ensuite utiliser l'injection de la propriété. Vous pouvez utiliser Ninject pour décorer la propriété de filtre comme dans l'exemple de @ Charlino. Ou comme suggéré par @mrydengren, vous pouvez le faire dans une sous-classe personnalisée de ControllerActionInvoker.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top