我是NLog的用戶,我正在創建自己的自定義目標。該目標將使用一些存儲庫(使用NHibernate)來保存日誌條目。NLog:自定義目標的依賴注入
是否可以使用任何IoC框架(最好是StructureMap)注入自定義目標所需的構造函數依賴項?
問候,
Ĵ
我是NLog的用戶,我正在創建自己的自定義目標。該目標將使用一些存儲庫(使用NHibernate)來保存日誌條目。NLog:自定義目標的依賴注入
是否可以使用任何IoC框架(最好是StructureMap)注入自定義目標所需的構造函數依賴項?
問候,
Ĵ
工具包更新到掛接,使用你自己的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>();
}
}
希望這會幫助某人。
Ĵ
我想爲人們提供一些背景,因爲我被你的答案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 2013-01-13 00:59:32