Joh*_*n S 2 model-view-controller log4net autofac
我已被指示在log4net旁边使用AutoFac(而不是Castle Windsor),并且在如何正确使用这些技术方面迷失了方向.
使用autofac网站上的示例我有以下LoggerModule
public class LoggingModule : Module
{
private static void InjectLoggerProperties(object instance)
{
var instanceType = instance.GetType();
// Get all the injectable properties to set.
// If you wanted to ensure the properties were only UNSET properties,
// here's where you'd do it.
var properties = instanceType
.GetProperties(BindingFlags.Public | BindingFlags.Instance)
.Where(p => p.PropertyType == typeof(ILog) && p.CanWrite && p.GetIndexParameters().Length == 0);
// Set the properties located.
foreach (var propToSet in properties)
{
propToSet.SetValue(instance, LogManager.GetLogger(instanceType), null);
}
}
private static void OnComponentPreparing(object sender, PreparingEventArgs e)
{
var t = e.Component.Activator.LimitType;
e.Parameters = e.Parameters.Union(
new[]
{
new ResolvedParameter((p, i) => p.ParameterType == typeof(ILog),
(p, i) => LogManager.GetLogger(t))
});
}
protected override void AttachToComponentRegistration(IComponentRegistry componentRegistry, IComponentRegistration registration)
{
// Handle constructor parameters.
registration.Preparing += OnComponentPreparing;
// Handle properties.
registration.Activated += (sender, e) => InjectLoggerProperties(e.Instance);
}
}
Run Code Online (Sandbox Code Playgroud)
以下代码注册它
builder.RegisterModule(new LoggingModule());
Run Code Online (Sandbox Code Playgroud)
这是整合它的正确方法吗?
我如何在MVC控制器中使用它?
log4net模块就像任何其他Autofac模块一样 - 您注册它(如您所示)ContainerBuilder以及所有其他注册.
// EITHER
builder.RegisterModule<LoggingModule>();
// OR
builder.RegisterModule(new LoggingModule());
Run Code Online (Sandbox Code Playgroud)
log4net模块页面上的文档说明了如何使用它将ILog参数注入到对象的构造函数或属性中.
因此,就像任何其他IoC结构化类一样,要使用它,您需要添加构造函数或属性以允许它被注入.
public class SomeClassThatNeedsLogging
{
private ILog _logger;
public SomeClassThatNeedsLogging(ILog logger)
{
this._logger = logger;
}
}
Run Code Online (Sandbox Code Playgroud)
而且,您可以再次使用构造函数或属性注入.
public class SomeClassThatNeedsLogging
{
public ILog Logger { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
当您解决注册的消费者时,Autofac会进行连线.
var someClass = container.Resolve<SomeClassThatNeedsLogging>();
// someClass will have the ILog value populated.
Run Code Online (Sandbox Code Playgroud)
对于控制器,您已经注册了Autofac,所以您需要做的就是添加构造函数参数或公共可写属性.MVC集成完成所有分辨率,因此无需手动操作,无需任何操作Resolve或任何操作.
如果仍然不清楚,我建议您花一些时间使用Autofac快速入门指南并深入了解其余文档.
| 归档时间: |
|
| 查看次数: |
3222 次 |
| 最近记录: |