NLog: внедрение зависимостей для пользовательских целей - PullRequest
4 голосов
/ 16 мая 2011

Я пользователь NLog и создаю свою собственную цель.Эта цель будет использовать некоторые репозитории (используя NHibernate) для сохранения записей журнала.

Можно ли внедрить требуемые зависимости конструктора пользовательских целей, используя любую инфраструктуру IoC, предпочтительно StructureMap?

Regards,

J

Ответы [ 2 ]

8 голосов
/ 13 января 2013

Я хочу предоставить некоторый контекст для людей, так как поначалу меня смутил ваш ответ JC.

public Program {

    //
    // Static constructor
    //
  static Program() {
    // Set up Ninject
    var kernel = new StandardKernel();

    // Register bindings
    RegisterServices(kernel);

    // Set up Ninject logging config
    NLog.Config.ConfigurationItemFactory.Default.CreateInstance = 
        (type) => kernel.TryGet(type);

    // Continue on!
  }

  private static void RegisterServices(IKernel kernel) {
    // bind services!
    kernel.Bind<IMyClass>().To<MyClass>();
  }
}

[Target("Custom")]
public class CustomTarget : TargetWithLayout {

    private IMyClass _myClass;
    public CustomTarget(IMyClass myClass) {

        // This will be injected!
        _myClass = myClass;
    }
}

Здесь показано, как настроить создание экземпляра и как все это сочетается с NLog. Надеюсь, что это помогает другим людям!

2 голосов
/ 14 марта 2012

Автор инструментария обновил платформу, чтобы выставлять хуки для использования вашего собственного контейнера DI. Ниже приведено одно возможное использование:

   public class LoggingConfiguration : ILoggingConfiguration
{
    public void SetDependencyResolver(IContainer container)
    {
        ConfigurationItemFactory.Default.CreateInstance = (Type type) => container.GetInstance(type);
    }
}

public static class DiagnosticsConfiguration
{
    public static void Configure(Action<ILoggingConfiguration> configuration)
    {
        var config = new LoggingConfiguration();
        configuration(config);
    }
}

public interface ILoggingConfiguration
{
    void SetDependencyResolver(IContainer container);
}

public interface IContainer
{
    object GetInstance(Type type);
}

public class StructureMapDependencyFactory : IContainer
{
    public object GetInstance(Type type)
    {
        return ObjectFactory.GetInstance(type);
    }

    public T GetInstance<T>()
    {
        return ObjectFactory.GetInstance<T>();
    }
}

Надеюсь, это кому-нибудь поможет.

J

...