C# 从简单注入器获取实例,而不使用;GetInstance";方法
接下来,我做了以下工作:C# 从简单注入器获取实例,而不使用;GetInstance";方法,c#,log4net,simple-injector,C#,Log4net,Simple Injector,接下来,我做了以下工作: public class Log4netAdapter<T> : ILogger { private static readonly log4net.ILog logger = LogManager.GetLogger(typeof(T)); public void Log(LogEntry entry) { if(entry.LoggingEventType == LoggingEventType.Informat
public class Log4netAdapter<T> : ILogger
{
private static readonly log4net.ILog logger = LogManager.GetLogger(typeof(T));
public void Log(LogEntry entry)
{
if(entry.LoggingEventType == LoggingEventType.Information)
logger.Info(entry.Message, entry.Exception);
else if(entry.LoggingEventType == LoggingEventType.Warning)
logger.Warn(entry.Message, entry.Exception);
else if(entry.LoggingEventType == LoggingEventType.Error)
logger.Error(entry.Message, entry.Exception);
else
logger.Fatal(entry.Message, entry.Exception);
}
}
还有别的选择吗
感谢在处理应用程序边界时,有时很难或不可能使用构造函数注入。典型的例子是需要默认构造函数的MVC过滤器属性或ASP.NET Web表单
Page
类
这些问题的一个典型解决方案是将这样的边界类变成一个组件,其中所有感兴趣的逻辑都从边界类中提取到一个组件中。边界类应仅包含对服务定位器的调用,并对已解析的服务调用一个方法。这将最大限度地减少应用程序中不稳定代码的数量
在所有其他情况下,应首选构造函数注入
但是,解析ILogger
意味着边界类做得太多了。相反,这个ILogger
应该是从边界类提取的组件的构造函数依赖项,从而成为一个普通对象
一旦你这样做了,你就不再直接解析ILogger
,这就解决了你的问题ILogger
已成为消费者的一种依赖,这确保Simple Injector能够代表您构建正确的Logger
在Web API中将依赖项应用于异常过滤器(您的特定情况)时,一个好的解决方案是为您的异常过滤器创建一个代理,该代理将调用委托给得到解决的实际过滤器。这可能是一种基础设施,并对其概念进行了解释
如果由于任何原因无法应用上述建议,您始终可以直接从容器请求记录器
:
ILogger log=SimpleInjectorInitializer.Container.GetInstance();
在应用程序边界上工作时,有时很难或不可能使用构造函数注入。典型的例子是需要默认构造函数的MVC过滤器属性或ASP.NET Web表单Page
类
这些问题的一个典型解决方案是将这样的边界类变成一个组件,其中所有感兴趣的逻辑都从边界类中提取到一个组件中。边界类应仅包含对服务定位器的调用,并对已解析的服务调用一个方法。这将最大限度地减少应用程序中不稳定代码的数量
在所有其他情况下,应首选构造函数注入
但是,解析ILogger
意味着边界类做得太多了。相反,这个ILogger
应该是从边界类提取的组件的构造函数依赖项,从而成为一个普通对象
一旦你这样做了,你就不再直接解析ILogger
,这就解决了你的问题ILogger
已成为消费者的一种依赖,这确保Simple Injector能够代表您构建正确的Logger
在Web API中将依赖项应用于异常过滤器(您的特定情况)时,一个好的解决方案是为您的异常过滤器创建一个代理,该代理将调用委托给得到解决的实际过滤器。这可能是一种基础设施,并对其概念进行了解释
如果由于任何原因无法应用上述建议,您始终可以直接从容器请求记录器
:
ILogger log=SimpleInjectorInitializer.Container.GetInstance();
你能举个例子说明你需要在哪里解决ILogger
问题以及为什么要这样做吗?嗨@Steven。谢谢你的回复。我更新了我原来的问题。你能举个例子说明你需要在哪里解决ILogger
,以及为什么要这样做吗?嗨@Steven。谢谢你的回复。我更新了我原来的问题。
container.RegisterConditional(
typeof(ILogger),
c => typeof(Log4netAdapter<>).MakeGenericType(c.Consumer.ImplementationType),
Lifestyle.Singleton,
c => true);
public class ExceptionWebApiHandlingAttribute : IExceptionFilter
{
public ExceptionWebApiHandlingAttribute()
{
}
}