2012-12-17 105 views
15

我目前正在从我的项目中删除Ninject,并转向使用简单注射器,但有一件事我无法正常工作。简单的注射器:注册一个基于父类型的构造参数的类型

对于我的日志,在服务的登记,我以前能够在一个参数传递到我的日志类这样

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

我正在寻找一种方式,简单的喷油器重新创建此。到目前为止,我还有其他一切工作,但这个。我可以记录工作,尽管不必被显示正确的记录器的名称,通过执行以下操作:

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

任何人有做任何类似的经验吗?

+1

相关:http://stackoverflow.com/questions/13675137/how-对返回的实例为基础上,其使用父 - - 简单的注射器 – Steven

回答

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(和我的答案),如果怀疑自己你不会记录太多。

5

Context based injection现在通过使用RegisterConditional方法支持Simple Injector 3。例如注入一个Logger成Consumer1和一个Logger成Consumer2,使用接受一个实现类型工厂委托RegisterConditional过载如下:

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