2014-02-22 45 views
1

我們有以下實現IProduct & ILogger類。經理類正被用作通信渠道。我們用團結下面給出的解決經理類,但它給下面的錯誤 -c#DI Unity容器如何解決依賴對象

===================unity configuration========== 

IUnityContainer container = new UnityContainer(); 
container.RegisterType<ILogger, FileLogger>("File"); 
container.RegisterType<ILogger, BDLogger>("DB"); 

container.RegisterType<IProduct, ProductA>("productA"); 
container.RegisterType<IProduct, ProductB>("productB"); 

container.RegisterType<ProducManager>(new InjectionConstructor(container.Resolve<IProduct>("productA"))); 

container.Resolve<ProducManager>("productA"); 

======================================================== 

「的依賴解析失敗,類型= \」 usingDI.IProduct \「 名= \」產品A \ 「。\ r \ n發生異常時: 正在解析中。\ r \ n異常是:InvalidOperationException - 當前使用DI.ILogger的 類型是一個接口,無法構造 您缺少類型 映射?\ r \ ñ----------------------------------------------- \ r \ n在例外情況的 時間,容器是:\ r \ n \ r \ n解決 us INDI.ProductA,productA(使用DI.IProduct,productA映射)\ r \ n 使用DI.ProductA(使用DI.ILogger記錄器)解析構造函數 的參數「記錄器」\ r \ n使用DI.ILogger解析 )\ r \ n「}」

請建議我最好的方式來解決經理類的依賴關係。

public interface IProduct 
{ 
    void dosomething(); 
} 

public class ProducManager 
{ 
    IProduct _product; 
    public ProducManager(IProduct product) 
    { 
     _product = product; 
    } 

    public void DoSomething() 
    { 
     _product.dosomething(); 
    } 
} 

public class ProductA : IProduct 
{ 
    ILogger _logger; 
    public ProductA(ILogger logger) 
    { 
     _logger = logger; 
    } 

    public void dosomething() 
    { 

     try 
     { 
      //code 
      // 
     } 
     catch (Exception ex) 
     { 
      _logger.WriteLog(ex.Message); 
     } 
    } 
} 

public class ProductB : IProduct 
{ 
    ILogger _logger; 
    public ProductB(ILogger logger) 
    { 
     _logger = logger; 
    } 

    public void dosomething() 
    { 

     try 
     { 
      //code 
      // 
     } 
     catch (Exception ex) 
     { 
      _logger.WriteLog(ex.Message); 
     } 
    } 
} 
public class LogManager 
{ 
    ILogger _logger; 
    public LogManager(ILogger logger) 
    { 
     _logger = logger; 
    } 

    public void WriteLog(string exception) 
    { 
     _logger.WriteLog(exception); 
    } 
} 

public interface ILogger 
{ 
    void WriteLog(string exception); 
} 

public class FileLogger : ILogger 
{ 

    public void WriteLog(string exception) 
    { 

    } 
} 

public class BDLogger : ILogger 
{ 

    public void WriteLog(string exception) 
    { 

    } 
} 
+0

ADDED UNITY CONFIGURATION。 –

回答

1

您需要註冊一個類型映射爲您的接口​​。否則,Unity現在不應該使用哪個實現​​它應該使用(請參閱您的例外)。

Here's一個例如用映射接口​​註冊到FileLogger

_container.RegisterType<ILogger, FileLogger>(); 

IProduct product = _container.Resolve<ProductA>(); //ILogger is injected to Product 
+0

感謝Jehof。 IProduct具有不同的產品實現,並且在特定的產品類中,我們需要使用一些其他類對象,如FileLogger,它們是從具有不同實現的某個接口派生而來的。當我們解析ProductA的ProductManager類時,想要解析FileLogger和ProductB DBLogger。請建議。 –

+0

然後,您需要爲具有InjectionConstructor(container.Resolve (「File」))和ProductB的ProductA執行類似的註冊。 – TylerOhlsen

+0

謝謝泰勒,你是對的。但最後我決定使用CI來代替註冊管理員類的ProductA,ProductB。 –