나는 NLog 사용자이며 사용자 지정 대상을 직접 만들고 있습니다. 이 타겟은 몇몇 저장소 (NHibernate 사용)를 사용하여 로그 항목을 유지합니다.NLog : 사용자 지정 대상에 대한 종속성 주입
IoC 프레임 워크, 특히 StructureMap을 사용하여 사용자 지정 대상의 필수 생성자 종속성을 주입 할 수 있습니까?
감사합니다,
J
나는 NLog 사용자이며 사용자 지정 대상을 직접 만들고 있습니다. 이 타겟은 몇몇 저장소 (NHibernate 사용)를 사용하여 로그 항목을 유지합니다.NLog : 사용자 지정 대상에 대한 종속성 주입
IoC 프레임 워크, 특히 StructureMap을 사용하여 사용자 지정 대상의 필수 생성자 종속성을 주입 할 수 있습니까?
감사합니다,
J
자신의 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
내가 당신의 대답 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와 함께 모든 인스턴스의 설정 방법을 보여줍니다. 희망은 다른 사람들을 돕는다!
다른 사람들을 주목하기 바란다. 여기서 중요한 줄은'ConfigurationItemFactory.Default.CreateInstance'이다. Ninject의 경우 이것은 간단히 : ConfigurationItemFactory.Default.CreateInstance = (type) => Kernel.TryGet (type)'일 것이지만, JC는 더 좋은 모듈 형 패턴을 제공합니다. – kamranicus