NLog:自定义目标的依赖注入

JB.*_*JB. 5 .net structuremap dependency-injection nlog ioc-container

我是NLog的用户,我正在创建自己的自定义目标.此目标将使用一些存储库(使用NHibernate)来持久保存日志条目.

是否可以使用任何IoC框架(最好是StructureMap)注入自定义目标所需的构造函数依赖项?

问候,

Ĵ

kam*_*cus 8

我想为人们提供一些背景,因为我最初被你的答案混淆了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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这将显示如何设置实例创建以及它如何与NLog配合使用.希望能帮到别人!


JB.*_*JB. 2

该工具包的作者更新了框架以公开使用您自己的 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>();
    }
}
Run Code Online (Sandbox Code Playgroud)

希望这会对某人有所帮助。

J