2009-05-18 57 views
0

我還在開始使用Unity,並且似乎有一個簡單的問題。如何配置Unity來創建一個具有兩個相同類型不同項目的類?

我有一個類對同一接口的兩個不同實例有依賴關係。我如何配置和解決這個課程?

I.E.鑑於:

public interface ILogger 
{ 
    void Write(string message); 
} 
public class ConsoleLogger : ILogger 
{ 
    public void Write(string message) 
    { 
     Console.WriteLine(message); 
    } 
} 
public class AnotherLogger : ILogger 
{ 
    public void Write(string message) 
    { 
     Console.WriteLine(DateTime.Now.ToString() + " " + message); 
    } 
} 
public class CombinedLogger : ILogger 
{ 
    IList<ILogger> _loggers; 
    public CombinedLogger(params ILogger[] loggers) 
    { 
     _loggers = new List<ILogger>(loggers); 
    } 
    public void Write(string message) 
    { 
     foreach(var logger in _loggers) logger.Write(message); 
    } 
} 

我知道如何配置ConsoleLogger和AnotherLogger。我也知道如何在實際代碼中訪問它們。我似乎在阻止的是如何配置和使用CombinedLogger,傳入ConsoleLogger和AnotherLogger的實例。

回答

2
IUnityContainer container = new UnityContainer(); 
container.RegisterType<ILogger, ConsoleLogger>(); 
container.RegisterType<ILogger, AnotherLogger>("another"); 
container.RegisterType<ILogger, CombinedLogger>("combined"); 
var instances = container.ResolveAll<ILogger>(); 
+0

好吧,我瞭解所有,但CombinedLogger知道創建時使用哪些其他實例。 I.E.我想要CombinedLogger訪問ConsoleLogger和AnotherLogger。 – 2009-05-18 19:25:50

1

您可以使用命名註冊。

myContainer.RegisterType(「ConsoleLogger」); myContainer.RegisterType(「AnotherLogger」); myContainer.RegisterType(「CombinedLogger」);

然後,當你解決的類型,您使用的名稱,以獲得特定的一個

public class CombinedLogger : ILogger{  
IList<ILogger> _loggers;  
public CombinedLogger(params ILogger[] loggers)  
{   
_loggers = new List<ILogger>();  
_loggers.Add(myContainer.Resolve(Of ILogger)("ConsoleLogger") 
_loggers.Add(myContainer.Resolve(Of ILogger)("AnotherLogger") 
}  
public void Write(string message)  
{   
foreach(var logger in _loggers) logger.Write(message);  
} 
} 
相關問題