2013-07-26 29 views
1

我試圖僞造企業庫LogWriter所以當我運行單元測試,它不執行任何記錄,所以它看起來像這樣的簡化版本:DI統一解析容器錯誤

public class MockLogger : ILogger 
{ 
     public MockLogger() 
     { 
     } 

     public void Write(object message) 
     {   
     } 

     public void Write(object message, string category) 
     {  
     } 

     public void Write(object message, string category, int eventId) 
     { 
     } 

     public void Write(object message, string category, int eventId, int priority) 
     { 
     } 

     public void Write(object message, string category, int eventId, int priority, TraceEventType severity) 
     { 
     } 
} 

public class Logger : ILogger 
{ 
     LogWriter writer; 
     public Logger() 
     { 
      writer = (new LogWriterFactory()).Create(); 

     } 

     public Logger(LogWriter logWriter) 
     { 
      writer = logWriter; 
     } 

     public void Write(LogEntry logEntry) 
     { 
      writer.Write(logEntry); 
     } 

     public void Write(object message) 
     { 
      writer.Write(message); 
     } 

     public void Write(object message, string category) 
     { 
      writer.Write(message, category); 
     } 

     public void Write(object message, string category, int eventId) 
     { 
      writer.Write(message, category, eventId); 
     } 

     public void Write(object message, string category, int eventId, int priority) 
     { 
      writer.Write(message, category, eventId, priority); 
     } 

     public void Write(object message, string category, int eventId, int priority, TraceEventType severity) 
     { 
      writer.Write(message, category, priority, eventId, severity); 
     } 

     public bool ShouldLog(LogEntry logEntry) 
     { 
      return writer.ShouldLog(logEntry); 
     } 
} 

然後我試圖解決它直通配置:

<unity xmlns="http://schemas.microsoft.com/practices/2012/unity"> 
<alias alias="ILogger" type="ConsoleApplicationTest.ILogger, ConsoleApplicationTest" /> 
<namespace name="ConsoleApplicationTest" /> 
<assembly name="ConsoleApplicationTest" /> 
<container> 
    <register type="ConsoleApplicationTest.ILogger, ConsoleApplicationTest" name="logger" mapTo="ConsoleApplicationTest.Logger, ConsoleApplicationTest"> 
    </register> 
</container> 
<container name="Mock"> 
    <register type="ConsoleApplicationTest.ILogger, ConsoleApplicationTest" name="mockLogger" mapTo="ConsoleApplicationTest.MockLogger, ConsoleApplicationTest"> 
    </register> 
</container> 

var container = new UnityContainer(); 
container.LoadConfiguration(); 
var logger = container.Resolve<ILogger>(); 

我getti錯誤ng是以下內容:

解析依賴性失敗,類型= 「ConsoleApplicationTest.ILogger」,name =「(none)」。同時發生異常 :解決。異常是:InvalidOperationException - 類型的ILogger沒有可訪問的構造函數。

這兩個類都有一個無參數的構造函數。我該怎麼做才能解決這個錯誤?使用.NET 4.5

回答

3

因爲你已經與name="logger"註冊的類型和name="mockLogger"已創建named registrations所以你需要在名稱中通過調用解決在:

var container = new UnityContainer(); 
container.LoadConfiguration(); 
var logger = container.Resolve<ILogger>("logger"); // or "mockLogger" 
+0

感謝您的答覆。那麼我該怎麼做,以便它不需要名稱來解決它呢? – Victor

+0

只需從配置中刪除'name =「logger」',這將是默認的ILogger。無論如何,因爲你的模擬實現是在不同的容器中註冊的,所以兩個實現不會相互衝突。 – nemesv

+0

我刪除它,所以現在我正在創建的錯誤是這個'解決方案的依賴失敗,鍵入=「ConsoleApplicationTest.ILogger」,名稱=「(無)」。 發生異常時:解析時。 異常是:InvalidOperationException - 類型IEnumerable'1沒有可訪問的構造函數。 – Victor