Инъекция сеттера с помощью конструктора с заданным типом - PullRequest
0 голосов
/ 06 декабря 2010

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

По сути, я пытаюсь использовать инъекцию сеттера StructureMap для логгера.реализация.Конструктор для регистратора, который я хочу использовать для 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 также вводит в них?Я полагаю, что нет, потому что как бы это знать?Итак, как я могу разрешить экземпляр правильно построенного регистратора для типа?(Я знаю, как вызвать распознаватель, что я делаю через локатор службы, но не знаю, как вызывать его для этой конкретной необходимости.)
  3. Мне приходит в голову, что это «просто не правильно».Может я что-то упускаю из именованных экземпляров?Потому что, если загрузчику удастся отобразить реализацию этого, как / когда тогда он будет предоставлять разные экземпляры для каждого класса, который имеет установщик?

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

1 Ответ

1 голос
/ 06 декабря 2010

Возможно, это не точный ответ, который вы ищете, но почему бы не упростить все, создав 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);
    }
}
...