Simple Injector是否可以与TypeFactoryContext一起注册实例工厂?

时间:2017-08-02 11:34:12

标签: c# dependency-injection log4net simple-injector

我正在研究一个严重需要重构SOLID原则的遗留代码库。我们正在将Simple Injector依赖注入容器添加到混合中作为第一步。

对于其中一个注册,我需要的东西非常类似于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&lt; TParent&gt; ,并在RegisterConditional调用中使用它:

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

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

1 个答案:

答案 0 :(得分:3)

  

这可以在Simple Injector中完成吗?

是和否。

  • ,使用RegisterConditional不支持此操作,因为Simple Injector会尝试将您推向注册类型,因此它可以验证和诊断您的对象图尽可能多。首选方法是创建一个代理类,与解释here一样。它基本上解释了您当前的解决方案,但是Logger<T>取代了LogImp,因为这会导致更简单的解决方案。

  • ,这是可能的,但您必须恢复使用here解释的自定义IDependencyInjectionBehavior(示例适用于Serilog,但可以很容易地重写为log4net)。但是,如果可能的话,第一种方法是首选。