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