Ninject多张实现绑定到接口(Ninject bind mulitple implementat

2019-09-29 11:55发布

我期待在本教程中,但并不完全了解如何创建一个工厂,可以给我提供一个接口的不同实现。

http://stefanoricciardi.com/2011/01/21/ninject-mini-tutorial-part-1/

public class IJob {
  ...
}

public class JobImpl1 : IJob {
  ...
}

public class JobImpl2 : IJob {
  ...
}

using (IKernel kernel = new StandardKernel()) {
    kernel.Bind<IJob>().To<JobImpl2>(); 
    var job = kernel.Get<IJob>();
}

我的目标是做一个工厂类,包装这个Ninject内核,所以我可以根据我无论是在单元测试环境VS现场环境是提供本人IJob接口的不同实现。 不过,我也想保持Ninject隐藏在工厂包装内部,使得代码的其余部分将不依赖于Ninject。

Answer 1:

有一个单独的扩展Ninject.Extensions.Factory ,它允许您根据接口产生飞抽象工厂实现

内核配置

var kernel = new StandardKernel();

// wire concrete implementation to abstraction/interface
kernel.Bind<IJob>().To<JobImpl1>()
    .NamedLikeFactoryMethod<IJob, IJobFactory>(f => f.GetJob());

// configure IJobFactory to be Abstract Factory
// that will include kernel and act according to kernel configuration    
kernel.Bind<IJobFactory>().ToFactory();

解决抽象工厂在使用运行时核心

// get an instance of Abstract Factory
var abstractFactory = kernel.Get<IJobFactory>();

// resolve dependency using Abstract Factory
var job = abstractFactory.GetJob()

抽象工厂接口

public interface IJobFactory
{
    IJobFactory GetJob();
}


文章来源: Ninject bind mulitple implementations to an interface