2014-02-06 41 views
0

問題背景:無法解析的接口使用Unity

我使用統一解析類和它所有的依賴關係。

問題:

我想傳遞到通過統一的接口類型,我試圖做到這一點,如下所示類的構造函數:

public static IFacade UnityNewsFacadeResolver() 
    { 
      IUnityContainer unityContainer = new UnityContainer(); 
      unityContainer.RegisterType<IFacade, NewsFacade>(); 
      IFacade newsFacadeInstance = unityContainer.Resolve<NewsFacade>(); 

      return newsFacadeInstance; 
    } 

以下顯示Unity設置構造函數參數的'NewsFacade'類。值得注意的是傳遞一個「NewsStoryHandler」具體類型,我想在這個類是一款基於IE INewsStoryHandler的接口傳遞:

private INewsStoryHandler _NewsStoryHandler; 

    //*****Unity will only pass in a concrete implementation, I want to pass it as an interface but cannot:****** 
    public NewsFacade(NewsStoryHandler newsStoryHandler) 
    { 
     if (newsStoryHandler == null) 
     { 
      throw new Exception("newsStoryHandler is null at the constrcutor"); 
     } 

     _NewsStoryHandler = newsStoryHandler; 
    } 

目前統一不會解決,並通過在接口類型,它必須是具體實現如上所示。這意味着我不能在單元測試時模擬界面。

有人能告訴我爲什麼Unity不會解析並傳入基於其接口的類型?

回答

1

Unity完全有能力根據其接口解析和提供類型。

要做到這一點,你必須確保統一知道什麼具體的實施提供,即

// Instruct unity to inject a NewsStoryHandler everywhere an INewsStoryHandler is specified 
unityContainer.RegisterType<INewsStoryHandler, NewsStoryHandler>(); 
var newsFacadeInstance = unityContainer.Resolve<NewsFacade>(); 

這工作假設你已經改變了你的NewsFacade構造有INewsStoryHandler類型的參數。

當涉及到單元測試,你就能夠嘲笑INewsStoryHandler使用起訂量,讓您的NewsFacade簡單,一個例子的測試:

// Setup and configure the mock 
var mockNewsStoryHandler = new Mock<INewsStoryHandler>(); 
mockNewsStoryHandler.Setup(h => h.GetAllStories()).Returns(Enumerable.Empty<NewsStory>()); 

// Inject the mock 
var newsFacade = new NewsFacade(mockNewsStoryHandler.Object); 
newsFacade.DoSomethingWithAllStories(); 

// Verify GetAllStories() was called exactly once 
mockNewsStoryHandler.Verify(h => h.GetAllStories(), Times.Once); 
+0

出色答卷。這一切工作。如果我可以問另一個問題。如果是Facade,我有三個類,即'頂層'類,這消耗了'NewsHandler',並且這消耗了在消費者構造函數中設置的每個'NewsRepository'。我將如何去設置並返回底層對象?即新聞資料庫? – user1352057

+1

您可以配置unity來注入正確的存儲庫,即'unityContainer.RegisterType ()',然後當解析立面時,存儲庫將被注入到消息處理程序中,該消息處理程序將被注入到立面中。 – Lukazoid