NLog: Dependency Injection for custom Targets

后端 未结 2 1460
情深已故
情深已故 2021-01-18 21:08

I am a user of NLog and I am creating my own custom target. This target will use some repositories (using NHibernate) to persist log entries.

Is it possible to inje

相关标签:
2条回答
  • 2021-01-18 21:14

    I want to provide some context for people, since I was confused at first by your answer 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;
        }
    }
    

    This shows how you set up the instance creation and how it all fits together with NLog. Hope that helps other people!

    0 讨论(0)
  • 2021-01-18 21:26

    The author of the toolkit updated the framework to expose hooks for using your own DI container. The following is one possible usage:

       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>();
        }
    }
    

    Hopefully this will help out someone.

    J

    0 讨论(0)
提交回复
热议问题