Mit

2016-04-16 7 views
5

ich eine Abhängigkeit in einen Controller zu injizieren bin versucht, die von Umbraco der RenderMvcController erbt und bekommen die FehlerMit

„Keine Anmeldung für Typ RenderMvcController gefunden werden konnte und eine implizite Registrierung konnte nicht hergestellt werden Damit der Container RenderMvcController erstellen kann, sollte er nur einen öffentlichen Konstruktor haben: 3. Weitere Informationen finden Sie unter https://simpleinjector.org/one-constructor.

Unten ist mein Code, um das DI

 var container = new Container(); 
     container.Options.DefaultScopedLifestyle = new WebRequestLifestyle(); 

     InitializeContainer(container); 

     container.RegisterMvcControllers(Assembly.GetExecutingAssembly()); 

     container.Verify(); 

     DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container)); 



    private static void InitializeContainer(Container container) 
    { 
     container.Register<ICacheProvider, CacheProvider>(Lifestyle.Transient); 
     container.Register<ICacheService, CacheService>(Lifestyle.Transient); 
    } 

Dies ist ein Beispiel einer Klasse empfängt die Abhängigkeit zu verdrahten, sie von einer Basisklasse erbt ich

public class NewsroomController : BaseRenderMvcController 
{ 
    public NewsroomController(ICacheService cacheService) : base(cacheService) { } 

Die Basisklasse schrieb erweitert RenderMvcController ist ein Umbraco Controller

public class BaseRenderMvcController : RenderMvcController 
{ 
    public ICacheService CacheService { get; set; } 
    public BaseRenderMvcController(ICacheService cacheService) 
    { 
     CacheService = cacheService; 
    } 
} 

Wie Sie die Basis Umbraco contro sehen können ller ist in der Tat hat 3 verschiedene Konstrukteure

public class RenderMvcController : UmbracoController, IRenderMvcController, IRenderController, IController 
{ 
    public RenderMvcController(); 
    public RenderMvcController(UmbracoContext umbracoContext); 
    public RenderMvcController(UmbracoContext umbracoContext, UmbracoHelper umbracoHelper); 

Ich bin nicht sicher, wie SimpleInjector zu bekommen schön geerbt mit diesem Controller platzieren von Umbraco.

Vielen Dank im Voraus!

+0

Also ist 'RenderMvcController' eine Basisklasse und soll nicht direkt vom Benutzer aufgerufen werden, wie in' http: // mysite/rendermvc'? Wer hat diesen 'RenderMvcController' definiert? Sie oder ist es Teil einer anderen Bibliothek (wie Umbraco selbst)? – Steven

+0

Ja, der RenderMvcController ist ein Controller, den Umbraco selbst bereitstellt, von dem er geerbt wird. –

+0

Deshalb habe ich BaseRenderMvcController gemacht, nur damit ich eine Basis haben kann, die ich kontrollieren kann, aber meine Basis muss immer noch von RenderMvcController erben, um Umbraco glücklich zu machen. –

Antwort

5

Die Ausnahmebedingungsnachricht "Es konnte keine Registrierung für den Typ RenderMvcController gefunden werden und eine implizite Registrierung konnte nicht vorgenommen werden" bedeutet, dass der Typ RenderMvcController direkt vom Simple Injector angefordert wird, obwohl er nicht registriert wurde. Ein Controllertyp wird normalerweise nur von DefaultControllerFactory angefordert und fordert nur dann einen bestimmten Typ an, wenn eine Anforderung mit dem Namen des Controllers in seiner URL wie folgt empfangen wird: http:\\localhost\RenderMvc\3.

Da Sie in den Kommentaren angegeben haben, dass die RenderMvcController nur als Basis-Controller verwendet werden soll, finde ich es verdächtig, dass es tatsächlich von MVC angefordert wird. Ich denke, du solltest darüber nachdenken.

Aber es ist die Verwendung dieser Steuerung ist wirklich erforderlich, können Sie einfach registrieren es in der Einfachen Injector wie folgt aus:

container.Register<RenderMvcController>(() => new RenderMvcController()); 

Es gibt Möglichkeiten Einfache Injector constructor resolution behavior, außer Kraft zu setzen, aber ich würde davon abraten, dies zu tun, weil es ein anti-pattern for components to have multiple constructors ist. Es ist ratsam, das automatische Verdrahtungsverhalten eines Containers nicht auf Frameworks-Typen anzuwenden (wie erklärt here), so dass es ratsam ist, sie mit einem Lambda zu registrieren.

+2

Das hat mein Problem behoben, obwohl ich einen Fehler bekommen habe, dass es IDisposable implementiert, also musste ich es container machen.Registrieren (() => new RenderMvcController(), Lifestyle.Scoped); –

+0

Auch habe ich überlegt, was Sie gesagt haben. Obwohl ich vom Controller erben muss, um irgendwelche benutzerdefinierten Routen zu überschreiben, denke ich, dass Umbaco diese Controller-Instanz für alle impliziten Routen verwenden würde, weshalb sie überhaupt aufgerufen wurde. Vielen Dank für Ihre Hilfe und danke für die Entwicklung der Bibliothek an erster Stelle! –