2011-05-16 67 views
3

我是NLog的用戶,我正在創建自己的自定義目標。該目標將使用一些存儲庫(使用NHibernate)來保存日誌條目。NLog:自定義目標的依賴注入

是否可以使用任何IoC框架(最好是StructureMap)注入自定義目標所需的構造函數依賴項?

問候,

Ĵ

回答

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

希望這會幫助某人。

Ĵ

+1

只需要注意別人,這裏的重點是'ConfigurationItemFactory.Default.CreateInstance'。對於Ninject而言,這只是:ConfigurationItemFactory.Default.CreateInstance =(type)=> Kernel.TryGet(type)',但是JC提供了更好的模塊化模式。 – kamranicus 2013-01-13 00:59:32

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

這顯示瞭如何設置實例創建以及它如何與NLog配合使用。希望能幫助別人!