Ninject是否具有相当于Autofac的TypedParameter或ResolvedParameter?

时间:2011-01-24 03:56:40

标签: ioc-container ninject autofac

在Autofac中,可以在注册服务时指定TypedParameter,该服务给出将传递给服务构造函数的特定值或委托。在解析/实例化期间,将通过类型发现构造函数上的实际参数。

在Ninject中,我只能找到对命名参数的支持(即,提前知道.ctor参数的实际名称)。否则,Ninject将发现未指定的构造函数参数,并尝试通过检查容器来解析所需的任何类型。

但是,这对我的需求来说还不够具体,因为我需要将多个相同类型的实例传递给不同服务实例的构造函数。

我想给Ninject一个特定的工厂委托或值作为构造函数参数,只给出一个类型作为限定符,而不是参数名称。我也不希望通过使用任何属性修饰构造函数参数来依赖Ninject。

这可能吗?非常感谢提前!

2 个答案:

答案 0 :(得分:6)

我认为你想要的是条件绑定。最普遍的是:

Bind<IFoo>().To<Foo>().When(request => SomeFancyFilter(); }

我不知道什么最适合你,因为你没有真正指定你真正想要实现的目标。但我想其中一个应该适用:

Bind<IFoo>().To<Foo1>().WhenInjectedInto<Class1>()
Bind<IFoo>().To<Foo2>().WhenInjectedInto<Class2>()

或者: 创建自己的属性,例如Bar1,Bar2并将它们添加到构造函数中:

public Class1([Bar1]IFoo foo)
public Class2([Bar2]IFoo foo)
public Class3([Bar2]IFoo foo)

Bind<IFoo>().To<Foo1>().WhenTargetHas<Bar1Attribute>()
Bind<IFoo>().To<Foo2>().WhenTargetHas<Bar2Attribute>()

答案 1 :(得分:0)

我不明白你的问题100%。你能举例说明你想做什么吗?这看起来可能符合您的需求:

https://github.com/ninject/ninject/wiki/Multi-injection

如果没有,我觉得你需要制作一个像这个例子的工厂方法:

    public override void Load()
    {
        Func<Ninject.Activation.IContext, IMyInterface> factoryFunc = 
            (context) => {
                return new ConcreteFactory(...parameters...); 
            };

        Bind<IMyInterface>().ToMethod(factoryFunc);
    }

在factoryFunc的方法中,您可以检查上下文(这是绑定上下文)以返回所需的工厂方法。具体来说,您可以检查context.Request.Servicecontext.Request.Target

同样,我需要看一个你正在做的事情的例子来真正回答你的问题。