2016-04-16 36 views
5

我試圖注入的依賴到控制器,從一把umbraco的RenderMvcController繼承並得到錯誤使用簡單的注射器用一把umbraco控制器

「類型RenderMvcController無需註冊,可以發現和隱性登記不能進行。對於能夠創建RenderMvcController的容器,它應該只有一個公共構造函數:它有3個。有關更多信息,請參閱https://simpleinjector.org/one-constructor

下面是我的代碼要連接的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); 
    } 

這是一類接收所述依賴關係的一個例子,它從基類我寫

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

基類延伸繼承RenderMvcController這是一個Umbraco控制器

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

正如你可以看到基地Umbraco控制米勒事實上確實有3個不同的構造

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

我不知道怎麼去SimpleInjector與該控制器從一把umbraco繼承很好的地方。

在此先感謝!

+0

所以這個'RenderMvcController'是一個基類,並不打算直接由用戶調用,如在'http:// mysite/rendermvc'中?誰定義了這個'RenderMvcController'?你還是它是另一個圖書館的一部分(如Umbraco本身)? – Steven

+0

是的RenderMvcController是Umbraco自己提供的一個控制器,它在那裏繼承。 –

+0

這就是爲什麼我製作了BaseRenderMvcController,只有這樣我才能控制一個基礎,但是我的基礎仍然需要從RenderMvcController繼承來保持Umbraco的快樂。 –

回答

5

異常消息「無法找到RenderMvcController類型的註冊並且無法進行隱式註冊」意味着RenderMvcController類型直接從簡單注入器請求,但尚未註冊。控制器類型通常僅由DefaultControllerFactory請求,並且只有在請求具有控制器名稱的請求時纔會請求特定類型,如http:\\localhost\RenderMvc\3

既然你在評論中陳述RenderMvcController只是作爲基礎控制器使用,我發現它是MVC實際要求它的可疑。我認爲你應該考慮一下。

但使用這種控制器的真正需要,你可以簡單地在簡單的噴油器這樣註冊它:

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

有辦法超越簡單的噴油器的constructor resolution behavior,但我建議不要做這個,因爲它是一個anti-pattern for components to have multiple constructors。明智的做法是在框架類型上不要使用容器的自動佈線行爲(如解釋here),因此建議您使用lambda註冊它們。

+2

這確實解決了我的問題,雖然我得到了一個錯誤,它實現了IDisposable,所以我不得不將它設置爲 container.Register (()=> new RenderMvcController(),Lifestyle.Scoped); –

+0

我也考慮過你說的。雖然我必須從控制器繼承來覆蓋任何自定義路由,但我想Umbaco會爲所有隱式路由使用該控制器實例,這就是爲什麼它首先被調用的原因。 非常感謝您的幫助,感謝您首先開發圖書館! –