我目前正在从我的项目中删除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"));
任何人都有类似经历的经验吗?
答案 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);