编程语言
首页 > 编程语言> > c#-Simple Injector是否可以结合TypeFactoryContext向实例工厂注册?

c#-Simple Injector是否可以结合TypeFactoryContext向实例工厂注册?

作者:互联网

我正在开发一个非常需要根据SOLID原则进行重构的旧代码库.第一步,我们将简单注入器依赖项注入容器添加到混合中.

对于其中一项注册,我需要非常类似于Log4Net的RegisterConditional示例的东西,即:

container.RegisterConditional(
    typeof(ILogger),
    c => typeof(Logger<>).MakeGenericType(c.Consumer.ImplementationType),
    Lifestyle.Singleton,
    c => true);

区别在于,我想注入由采用c.Consumer.ImplementationType作为输入的工厂方法返回的实例:

container.Register???(
    typeof(ILogger),
    c => LoggerProvider.GetLogger(c.Consumer.ImplementationType),
    Lifestyle.Transient);

可以在Simple Injector中完成吗?

我已经阅读了a similar question的答案,但这还不够.需要将ImplementationType传递给实例工厂.

暂时,我将实现Logger< TParent>.并在RegisterConditional调用中使用它:

public class Logger<TParent> : ILogger
{
    private readonly ILogger _decoratedLogger;

    public Logger()
    {
        _decoratedLogger = Logger.GetLogger(typeof(TParent));
    }
}

解决方法:

Can this be accomplished in Simple Injector?

是的,没有.

>不,使用RegisterConditional不支持此功能,这是因为Simple Injector会尝试将您推向注册类型,因此它可以尽可能多地验证和诊断对象图.首选的方法是创建一个代理类,就像here解释的那样.它基本上解释了您当前的解决方案,但是具有Logger< T>.而是继承自LogImp,因为这导致了更简单的解决方案.
>是的,这是可能的,但是您必须还原为使用自定义的IDependencyInjectionBehavior,如here所述(该示例适用于Serilog,但可以轻松地重写为log4net).但是,如果可能,首选第一种方法.

标签:dependency-injection,log4net,c,simple-injector
来源: https://codeday.me/bug/20191111/2017448.html