阅读 NInject v3 上的新文档以及如何使用 Factory Extension 之后,显然我还是没有完全得到它,因为我的代码会抛出异常地方...
我得到了这个例外,如果人们愿意,我可以粘贴整件事,但我现在会尝试保持简短。
激活IDeployEntityContainer时出错没有匹配的绑定可用, 而且这种类型不能自我约束。
这是我的代码...... Ninject绑定模块类
class MyNinjectModule : NinjectModule {
public override void Load() {
...
Bind<IDeployEntityFactory>().ToFactory();
Bind<IDeployEntityContainer>().To<DeployEntityContainer>();
...
}
}
使用工厂的类
class DeployController : IDeployController {
private readonly IDeployEntityFactory _entityFactory;
public DeployController(..., IDeployEntityFactory entityFactory) {
...
}
public void Execute() {
...
//I get the Exception on this line...
_entityFactory.GetDeployEntity<IDeployEntityContainer>();
...
}
}
工厂界面
public interface IDeployEntityFactory
{
T GetDeployEntity<T>();
}
工厂实施
public class DeployEntityFactory : IDeployEntityFactory
{
private readonly IResolutionRoot _resolutionRoot;
public DeployEntityFactory(IResolutionRoot resolutionRoot)
{
_resolutionRoot = resolutionRoot;
}
public T GetDeployEntity<T>()
{
return _resolutionRoot.Get<T>();
}
}
在幕后,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)
{
}
}
答案 0 :(得分:2)
我最终只是将绑定更改为普通绑定,
Bind<IMyFactory>().To<MyFactory>().InSingletonScope();
它有效!我的第一个想法是大声笑,但它也是有道理的。
使用ToFactory()
绑定它从未使用我的工厂实现,它只是从定义的接口生成一个。
现在它使用我的实现。工厂稍作改动:从工厂中新建内核或在构造函数中注入它,现在我注入了IResolutionRoot
Get<T>();
我的对象。
以下是新代码,仅供澄清。
class MyNinjectModule : NinjectModule {
public override void Load() {
...
Bind<IDeployEntityFactory>().To<DeployEntityfactory>().InSingletonScope();
Bind<IDeployEntityContainer>().To<DeployEntityContainer>();
...
}
}
public class DeployEntityFactory : IDeployEntityFactory
{
private readonly IResolutionRoot _resolutionRoot;
...
public DeployEntityFactory(..., IResolutionRoot resolutionRoot)
{
...
_resolutionRoot = resolutionRoot;
}
public T GetDeployEntity<T>()
{
return _resolutionRoot.Get<T>();
}
}
如果这不是正确的方法,我希望有人可以解释它并以正确的方式通知我......我想@remogloor会知道这样的事情。 :)