Simple Injector:使用基于其父级的构造函数参数注册类型

时间:2012-12-17 15:46:12

标签: c# dependency-injection ioc-container simple-injector

我目前正在从我的项目中删除Ninject,并转向使用Simple Injector,但有一件事我无法正常工作。

对于我的日志记录,在注册服务时,我之前能够将参数传递到我的日志记录类中

_kernel.Bind<ILogger>().To<Logger>()
    .WithConstructorArgument("name",
        x => x.Request.ParentContext.Request.Service.FullName);

我正在寻找一种在Simple Injector中重新创建它的方法。到目前为止,我还有其他一切工作但是这个。我可以通过执行以下操作来使日志记录正常工作,尽管没有显示正确的记录器名称:

_container.Register<ILogger>(() => new Logger("test"));

任何人都有类似经历的经验吗?

2 个答案:

答案 0 :(得分:11)

该注册是基于上下文的注入的一种形式。您可以使用其中一个RegisterConditional重载。

然而,

RegisterConditional不允许使用工厂方法来构造类型。因此,您应该创建Logger类的通用版本,如下所示:

public class Logger<T> : Logger
{
    public Logger() : base(typeof(T).FullName) { }
}

您可以按如下方式注册:

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

但请阅读this Stackoverflow question(和我的回答),如果你没有记录太多,请自问。

答案 1 :(得分:5)

现在,使用RegisterConditional方法在Simple Injector 3中支持

Context based injection。例如,要将Logger注入Consumer1,将Logger注入Consumer2,请使用接受实现类型工厂委托的RegisterConditional重载,如下所示:

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