【问题标题】:Does Ninject have an equivalent of Autofac's TypedParameter or ResolvedParameter?Ninject 是否具有 Autofac 的 TypedParameter 或 ResolvedParameter 的等效项?
【发布时间】:2011-01-24 03:56:40
【问题描述】:

在 Autofac 中,可以在服务注册时指定一个 TypedParameter 来提供特定的值或委托,该值或委托将被传递到服务的构造函数中。构造函数上的实际参数将在解析/实例化期间按类型发现。

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

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

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

这可能吗?非常感谢!

【问题讨论】:

  • 次要点 - 如果 Ninject 具有 Autofac ResolvedParameter 的等价物(即提供我自己的委托的某种方式,它告诉 Ninject 在参数发现期间参数是否与我的过滤器匹配)这也将满足我的需要。谢谢!

标签: ioc-container ninject autofac


【解决方案1】:

我认为你想要的是条件绑定。最通用的是:

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>()

【讨论】:

  • 非常好!我在哪里可以找到这些文档? (总的来说,Ninject 似乎很少有文档!)
  • 是的,文档很少。我们的时间有限,我们必须专注于最重要的事情。欢迎大家支持改变这一点。目前最好的文档来源是单元测试和源代码文档。此外,界面易于理解。
【解决方案2】:

我 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

再次,我需要看一个你正在做什么的例子才能真正回答你的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-13
    • 2020-08-23
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-28
    • 2013-08-11
    相关资源
    最近更新 更多