2016-04-29 23 views
0

Suchen nach einer Antwort (oder einer Alternative) zu diesem.Autofac-Auflösung in der statischen Methode

Ich überarbeite eine unserer Kernanwendungen, um einige DI zu verwenden. Die Waffe der Wahl ist Autofac.

Alles geht schon Dünung bis ich auf diese Erweiterung Methode gestolpert:

public static bool ActionAuthorized(this HtmlHelper htmlHelper, string actionName, string controllerName) 
    { 


     IRouteService _routeService; //<---------How do I get the instance here? 


     Models.Routing.Routes thisRoute = _routeService.GetRoutes().FirstOrDefault(x => x.Action == actionName && x.Controller == controllerName); 

     ///removed for brevity.... 

     return false; 
    } 

Diese Erweiterung verwendet wird, Teile der Anwendung zu sichern (den Link zeigen, verstecken Sie den Link, etc).

Glücklicherweise wird die Erweiterung nur in einer Ansicht (_shared) verwendet - aber es ist eine Layoutansicht - so trifft es alles.

Ich betrachtete die Unterschrift Refactoring die List<Routes> so zu injizieren:

public static bool ActionAuthorized(this HtmlHelper htmlHelper, string actionName, string controllerName, List<Routes> routes) 

, dass diese einfachen machen würde:

Models.Routing.Routes thisRoute = routes.FirstOrDefault(x => x.Action == actionName && x.Controller == controllerName); 

Aber wie ich schon sagte, dies ein Teil ist (_shared) sehen.

Ich müsste JEDES ViewModel ändern, um Routen in die Signatur aufzunehmen ... was ich wirklich nicht tun möchte.

Das grundlegende Problem ist DI und Static Classes ist schlecht ju ju .... Ich verstehe es. Die Erweiterungsmethoden sind jedoch Teil der .NET-Entwicklung (und ein leistungsfähiges Feature). Es ist nicht weit hergeholt anzunehmen, dass eine Business-Logik-Komponente (Dienst) innerhalb von benutzerdefinierten Erweiterungsmethoden benötigt wird.

Irgendwelche Ideen dazu?

Antwort

3

Wenn Sie mit einer statischen stecken, ist die Antwort "Service-Standort." Es ist nicht schön, aber es ist was es ist.

Es sieht so aus, als ob Sie MVC verwenden, was die Verwendung von DependencyResolver.Current.GetService() bedeuten würde.

+0

Dies wurde etwas viel größer mit vielen technischen Debatten zwischen meinen Entwicklern. Es ist komisch, wie dies eine größere Konvention hervorbrachte, die wir benutzt haben. Aber ich danke @Travis für die Antwort. Ich konnte es woanders verwenden. – JDBennett

Verwandte Themen