Как настроить Unity для создания класса, который принимает два разных элемента одного типа? - PullRequest
0 голосов
/ 18 мая 2009

Я все еще начинаю с Unity, и у меня возник вопрос, который кажется простым.

У меня есть класс, который зависит от двух разных экземпляров одного и того же интерфейса. Как мне настроить и разрешить этот класс?

т.е. Дано:

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.

Ответы [ 3 ]

2 голосов
/ 18 мая 2009
IUnityContainer container = new UnityContainer();
container.RegisterType<ILogger, ConsoleLogger>();
container.RegisterType<ILogger, AnotherLogger>("another");
container.RegisterType<ILogger, CombinedLogger>("combined");
var instances = container.ResolveAll<ILogger>();
1 голос
/ 19 мая 2009

Прочтите документацию по поддержка конфигурации для массивов .

1 голос
/ 18 мая 2009

Вы используете именную регистрацию.

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