2010-12-06 2 views
0

Интересно, если это что-то очень простое, что я просто отсутствую, или если есть еще много чего.Сетчатый инжектор с конструктором с типом

В принципе, я пытаюсь использовать инъекцию SystemMap для реализации регистратора. Конструктор для регистратора, что я хочу для StructureMap для использования принимает параметр Type для создания регистратора:

public class Logger : ILogger 
{ 
    private ILog _log = null; 

    public Logger() { _log = LogManager.GetCurrentClassLogger(); } 

    public Logger(string name) { _log = LogManager.GetLogger(name); } 

    public Logger(Type loggerType) { _log = LogManager.GetLogger(loggerType); } 

    // The rest of the implementation... 
} 

В моей самонастройке коде я инициализировать его как таким образом:

ObjectFactory.Configure(x => { 
    x.FillAllPropertiesOfType<ILogger>().Use(l => 
     new Logger(l.BuildStack.Current.ConcreteType)); 
    // Further unrelated bootstrapping... 
}); 

Это не совсем работает 100%, и это, вероятно, просто отсутствие полного понимания с моей стороны. Поэтому у меня есть несколько вопросов по поводу поведения я вижу:

  1. «Тип», что регистратор видит, когда я ступаю через отладчик и углубиться в реализации log4net, имеет ILogger. Как я могу заставить это быть того типа, который содержит введенный сеттер?
  2. Устанавливаются только сеттеры в экземплярах StructureMap. Например, на интерфейсах/реализациях репозитория для уровня доступа к данным. Другие объекты, такие как мои бизнес-модели, не построены из графика StructureMap и просто создаются как обычно. Есть ли способ рассказать StructureMap, чтобы он также вводил в них? Полагаю, что нет, потому что, как бы это узнать? Итак, как я могу разрешить экземпляр правильно построенного регистратора для типа? (Я знаю, как вызвать resolver, который я делаю через локатор сервисов, а не как назвать его для этой конкретной потребности.)
  3. Мне кажется, что это «просто не кажется правильным». Может, мне что-то не хватает в названных экземплярах? Потому что, если загрузчику удается отобразить эту реализацию, как/когда он будет поставлять разные экземпляры для каждого класса, у которого есть сеттер?

Возможно, существует совершенно другой/более простой/лучший способ выполнить то, что я пытаюсь сделать, и я приветствую предложения для этого. В принципе, я абстрагирую свою реализацию регистрации за контейнером IoC, и мне нужны регистраторы, специфичные для классов.

ответ

1

Возможно, это не точный ответ, который вы ищете, но почему бы не упростить все, создав ILoggerFactory? Вместо регистрации ILogger, вы можете зарегистрировать ILoggerFactory и ввести ILoggerFactory в классах:

public interface ILoggerFactory 
{ 
    ILogger CreateFor(string name); 
    ILogger CreateFor<T>(); 
    ILogger CreateFor(Type loggerType); 
} 

public class LoggerFactory : ILoggerFactory 
{ 
    public ILogger CreateFor(string name) 
    { 
     return LogManager.GetLogger(name); 
    } 

    public ILogger CreateFor<T>() 
    { 
     return CreateFor(typeof(T)); 
    } 

    public ILogger CreateFor(Type loggerType) 
    { 
     return LogManager.GetLogger(loggerType); 
    } 
} 
+1

Интересный. Это может быть просто путь. Это не кажется настолько элегантным, как прямое вложение правильного регистратора, но с этим можно работать. Хотя, честно говоря, я не нашел, что существующая реализация полностью изящна. Что-то о том, что внутренний логгер класса публично настраивается, просто не подходит мне. (Примечание: это не моя реализация, я просто пытаюсь загрузить ее.) – David 2010-12-06 18:19:11

Смежные вопросы