1

我正在查看本教程,但不太了解如何创建一个可以为我提供接口的单独实现的工厂。

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 Kernel 的工厂类,这样我就可以根据我是在单元测试环境还是实时环境中提供不同的 IJob 接口实现。但是,我还想将 Ninject 隐藏在工厂包装器中,以便其余代码不依赖于 Ninject。

4

1 回答 1

2

有一个单独的扩展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();
}
于 2012-12-24T17:28:05.517 回答