3

나는 NLog 사용자이며 사용자 지정 대상을 직접 만들고 있습니다. 이 타겟은 몇몇 저장소 (NHibernate 사용)를 사용하여 로그 항목을 유지합니다.NLog : 사용자 지정 대상에 대한 종속성 주입

IoC 프레임 워크, 특히 StructureMap을 사용하여 사용자 지정 대상의 필수 생성자 종속성을 주입 할 수 있습니까?

감사합니다,

J

답변

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

는 희망이 사람을 도움이 될 것입니다 : 다음은 하나 개의 가능한 사용합니다.

J

+1

다른 사람들을 주목하기 바란다. 여기서 중요한 줄은'ConfigurationItemFactory.Default.CreateInstance'이다. Ninject의 경우 이것은 간단히 : ConfigurationItemFactory.Default.CreateInstance = (type) => Kernel.TryGet (type)'일 것이지만, JC는 더 좋은 모듈 형 패턴을 제공합니다. – kamranicus

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와 함께 모든 인스턴스의 설정 방법을 보여줍니다. 희망은 다른 사람들을 돕는다!