NInject扩展工厂

在阅读了NInject v3上的新文档以及如何使用Factory Extension之后 ,显然我仍然没有完全得到它,因为我的代码抛出exception到处…

我得到了这个例外,如果人们愿意,我可以粘贴整个东西,但我会尽量保持简短。

激活IDeployEntityContainer时出错没有匹配的绑定可用,并且该类型不可自我绑定。

这是我的代码…… Ninject Bind Module类

class MyNinjectModule : NinjectModule { public override void Load() { ... Bind().ToFactory(); Bind().To(); ... } } 

使用工厂的类

 class DeployController : IDeployController { private readonly IDeployEntityFactory _entityFactory; public DeployController(..., IDeployEntityFactory entityFactory) { ... } public void Execute() { ... //I get the Exception on this line... _entityFactory.GetDeployEntity(); ... } } 

工厂界面

 public interface IDeployEntityFactory { T GetDeployEntity(); } 

工厂实施

 public class DeployEntityFactory : IDeployEntityFactory { private readonly IResolutionRoot _resolutionRoot; public DeployEntityFactory(IResolutionRoot resolutionRoot) { _resolutionRoot = resolutionRoot; } public T GetDeployEntity() { return _resolutionRoot.Get(); } } 

在幕后Ninject将创建一个代理,实现指定的工厂接口并拦截所有方法,以便代理行为像…

我知道如果我不需要在工厂内创建对象时做一些特殊/自定义的事情,我就不必实际创建自己的实现。

资料来源: http : //www.planetgeek.ch/2011/12/31/ninject-extensions-factory-introduction/

EDIT1:

为了确保我留下您需要查看问题的所有信息,我添加了DeployEntityContainer类/接口

 public abstract class DeployEntityBase : IDeployEntity { ... protected readonly IDeployEntityFactory _entityFactory; protected DeployEntityBase(..., IDeployEntityFactory entityFactory) { ... _entityFactory = entityFactory; ... } ... } public class DeployEntityContainer : DeployEntityBase, IDeployEntityContainer { ... public DeployEntityContainer(..., IDeployEntityFactory entityFactory) : base(..., entityFactory) { } } 

我最后只是将绑定更改为普通绑定,

 Bind().To().InSingletonScope(); 

它工作了! 我的第一个想法是大声笑,但它也是有道理的。

使用ToFactory()绑定它从未使用我的工厂实现,它只是从定义的接口生成一个。

现在它使用我的实现。 工厂稍微改了一下:从工厂中新建内核或者在构造函数中注入它,现在我注入了IResolutionRootGet(); 我的对象。

这是新代码,只是为了澄清。

 class MyNinjectModule : NinjectModule { public override void Load() { ... Bind().To().InSingletonScope(); Bind().To(); ... } } public class DeployEntityFactory : IDeployEntityFactory { private readonly IResolutionRoot _resolutionRoot; ... public DeployEntityFactory(..., IResolutionRoot resolutionRoot) { ... _resolutionRoot = resolutionRoot; } public T GetDeployEntity() { return _resolutionRoot.Get(); } } 

如果这不是正确的方法,我希望有人可以解释它并以正确的方式通知我……我想@remogloor会知道这样的事情。 🙂