Интересно, если это что-то очень простое, что я просто отсутствую, или если есть еще много чего.Сетчатый инжектор с конструктором с типом
В принципе, я пытаюсь использовать инъекцию 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%, и это, вероятно, просто отсутствие полного понимания с моей стороны. Поэтому у меня есть несколько вопросов по поводу поведения я вижу:
- «Тип», что регистратор видит, когда я ступаю через отладчик и углубиться в реализации log4net, имеет
ILogger
. Как я могу заставить это быть того типа, который содержит введенный сеттер? - Устанавливаются только сеттеры в экземплярах StructureMap. Например, на интерфейсах/реализациях репозитория для уровня доступа к данным. Другие объекты, такие как мои бизнес-модели, не построены из графика StructureMap и просто создаются как обычно. Есть ли способ рассказать StructureMap, чтобы он также вводил в них? Полагаю, что нет, потому что, как бы это узнать? Итак, как я могу разрешить экземпляр правильно построенного регистратора для типа? (Я знаю, как вызвать resolver, который я делаю через локатор сервисов, а не как назвать его для этой конкретной потребности.)
- Мне кажется, что это «просто не кажется правильным». Может, мне что-то не хватает в названных экземплярах? Потому что, если загрузчику удается отобразить эту реализацию, как/когда он будет поставлять разные экземпляры для каждого класса, у которого есть сеттер?
Возможно, существует совершенно другой/более простой/лучший способ выполнить то, что я пытаюсь сделать, и я приветствую предложения для этого. В принципе, я абстрагирую свою реализацию регистрации за контейнером IoC, и мне нужны регистраторы, специфичные для классов.
Интересный. Это может быть просто путь. Это не кажется настолько элегантным, как прямое вложение правильного регистратора, но с этим можно работать. Хотя, честно говоря, я не нашел, что существующая реализация полностью изящна. Что-то о том, что внутренний логгер класса публично настраивается, просто не подходит мне. (Примечание: это не моя реализация, я просто пытаюсь загрузить ее.) – David 2010-12-06 18:19:11