2009-05-18 5 views
0

Je commence toujours avec Unity, et j'ai ce qui me semble être une question simple.Comment configurer Unity pour créer une classe qui prend deux éléments différents de même type?

J'ai une classe qui dépend de deux instances différentes de la même interface. Comment configurer et résoudre cette classe?

I.E. Étant donné:

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); 
    } 
} 

Je sais comment configurer pour ConsoleLogger et AnotherLogger. Je sais aussi comment y accéder dans le code actuel. Ce que je semble bloquer est de comprendre comment configurer et utiliser CombinedLogger, en passant dans les instances de ConsoleLogger et AnotherLogger.

Répondre

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

Ok, je comprends tout, mais comment CombinedLogger sait quelles autres instances utiliser quand il est créé. C'EST À DIRE. Je veux que CombinedLogger accède à la fois à ConsoleLogger et AnotherLogger. –

1

Vous utilisez un enregistrement nommé.

myContainer.RegisterType ("ConsoleLogger"); myContainer.RegisterType ("AnotherLogger"); myContainer.RegisterType ("CombinedLogger");

Puis, quand vous résolvez le type, vous avez utilisé le nom pour obtenir le spécifique un

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);  
} 
} 
Questions connexes