NInject扩展工厂

时间:2012-06-26 12:49:04

标签: c# dependency-injection inversion-of-control ninject factory

阅读 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)
    {
    }
}

1 个答案:

答案 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会知道这样的事情。 :)