【问题标题】:Injecting multiple constructor parameters of the same type with Ninject 2.0使用 Ninject 2.0 注入多个相同类型的构造函数参数
【发布时间】:2011-11-02 15:26:04
【问题描述】:

我正在使用 Ninject 2.0 在我的一个应用程序中处理 DI,我遇到了一些让我感到困惑的事情。老实说,零文档也无济于事。

假设我有一个带有签名的构造函数 -

ctor(IServiceFactory factory1, IServiceFactory factory2)
{
    this.factory1 = factory1;
    this.factory2 = factory2;
}

虽然这两个服务实现了相同的接口,但它们是完全不同的实现,并且在不同的时间使用,所以我不想注入IEnumerable<IServiceFactory>

我的问题是,当我绑定实例时,如何告诉 Ninject 为每个实例注入什么?

提前致谢。

更新

为了任何想要查看代码的人都会在阅读 Remo 的链接后结束,...这里是简短的。 (我从来没有意识到 C# 有参数属性!)

//abstract factory
public interface IServiceFactory
{
    Service Create();
}

//concrete factories
public class Service1Factory : IServiceFactory
{
    public IService Create()
    {
        return new Service1();
    }
}

public class Service2Factory : IServiceFactory
{
    public IService Create()
    {
        return new Service2();
    }
}

//Binding Module (in composition root)
public class ServiceFactoryModule : NinjectModule
{
    public override void Load()
    {
        Bind<IServiceFactory>()
            .To<Service1Factory>()
            .Named("Service1");

        Bind<IServiceFactory>()
            .To<Service2Factory>()
            .Named("Service2");
    }
}

//consumer of bindings
public class Consumer(
    [Named("Service1")] service1Factory,
    [Named("Service2")] service2Factory)
{
}

【问题讨论】:

    标签: dependency-injection inversion-of-control ninject-2


    【解决方案1】:

    首先你必须问自己,如果实现需要做完全不同的事情,使用相同的接口是否正确。通常,接口是消费者和实现之间的契约。因此,如果消费者期望不同的东西,那么您可以考虑定义不同的接口。

    如果您决定使用相同的界面,则必须使用条件绑定。请参阅有关如何完成此操作的文档:

    https://github.com/ninject/ninject/wiki/Contextual-Binding

    https://github.com/ninject/ninject/wiki/Conventions-Based-Binding

    【讨论】:

    • 谢谢雷莫。它们实际上是在 UI 中创建选项卡的抽象工厂的不同实现,所以它们做同样的事情,......只是出于不同的原因。
    • 我认为您没有正确理解。从消费者的角度来看,他们做的不是一回事。接口应该从消费者的角度来定义。例如。如果您有一个工厂接口 Fruit CreateFruit() 并且消费者希望有两种实现,一种用于香蕉,一种用于橙子,那么您最好将接口定义为 Banana CreateBanana()Orange CreateOrange(),即使您只需要它们作为水果。
    • 我明白了。您建议我使用工厂方法而不是具有具体工厂类的抽象工厂。这是一个选项,但工厂类本身具有需要注入的依赖项(在这种情况下为子屏幕)。使用具体的工厂和构造函数注入而不是工厂方法更容易解决这些依赖关系,不是吗?或者 Ninject 是否还有我缺少的其他魔法?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-23
    • 2018-03-27
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    相关资源
    最近更新 更多