C# Can';I don’我不知道如何让这个DI的东西继续下去

C# Can';I don’我不知道如何让这个DI的东西继续下去,c#,ninject-2,C#,Ninject 2,好吧,我觉得自己像个十足的白痴。我已经阅读了文档,但仍然无法与Ninject合作 public class ContextAdapter:IDbSetProvider { private readonly IContextFactory _contextFactory; #region Implementation of IDbSetProvider public ContextAdapter(IContextFactory contextFactory) {

好吧,我觉得自己像个十足的白痴。我已经阅读了文档,但仍然无法与Ninject合作

 public class ContextAdapter:IDbSetProvider
{
    private readonly IContextFactory _contextFactory;
    #region Implementation of IDbSetProvider

    public ContextAdapter(IContextFactory contextFactory)
    {
        this._contextFactory = contextFactory;
    }

    public IDbSet<TEntity> CreateDBSet<TEntity>() where TEntity : class
    {
        var context = _contextFactory.Create();
        return context.Set<TEntity>();
    }

    #endregion
}
公共类ContextAdapter:IDbSetProvider
{
私有只读IContextFactory\u contextFactory;
#IDbSetProvider的区域实现
公共上下文适配器(IContextFactory上下文工厂)
{
这._contextFactory=contextFactory;
}
公共IDbSet CreateDBSet(),其中tenty:class
{
var context=_contextFactory.Create();
返回context.Set();
}
#端区
}
正如您所看到的,我需要为上面的类注入构造函数。嗯,事情进展得不太顺利。 救命!!在我回到编写perl代码之前。开玩笑!!哈哈


您的类
ContextAdapter
未实现
IContextFactory
。您是否有类似于
类工厂:IContextFactory
的类?这就是你在这里错过的。然后您可以将它绑定到kernel.bind.To(),当您请求一个对象或当它需要履行契约时,Ninject将为您创建该类型。我认为你的困惑来自绑定语法。通常,您不是将参数绑定在一起,而是将接口绑定到具体实现。下面是一个简单的例子:

Bind<IEngine>.To<GasEngine>();
Bind<ICar>.To<Sedan>();

class Sedan : ICar
{
    public Sedan(IEngine engine) { }
}

// ...

kernel.Get<ICar>(); // get me a new car
Bind.To();
Bind.To();
等级轿车:ICar
{
公共轿车(发动机){}
}
// ...
kernel.Get();//给我买辆新车

当您向Ninject索要
ICar
时,它将用绑定的
Sedan
来完成它
轿车
在其构造中需要一个
发动机
,Ninject将用
汽油发动机
来实现,因为这是绑定的。

是的,它是一个工厂。不仅仅是一个普通的ol工厂.kernel.Bind().To().WithConstructorArgument(IContextFactory,_contextFactory);这甚至没有编译,我缺少什么?我正在按照教程中的“为什么要尝试将接口
IContextFactory
作为参数传递给
with constructorargument
”,您不能只传递接口声明。是否应该有
.WithConstructorArgument(“contextFactory”,“U contextFactory”)
?因此,为了注入依赖项以满足构造函数,类必须从IcontextFactory继承?有趣的是,我当时正在思考这一切背后的逻辑。如果我像这样放入[Inject]属性:[Inject]public ContextAdapter(IContextFactory contextFactory){this.\u contextFactory=contextFactory;}您仍然需要绑定
IContextFactory
的具体实现
kernel.Bind.To()
错误。只有在类中有多个构造函数并且希望Ninject使用特定的构造函数时,才使用构造函数上的
[Inject]
属性。你也可以把它应用到属性中,让它们被注入。那么文档一定是不正确的。或者我正在读它:)如果ninject看到[Inject]属性,它将尝试为每个参数激活一个对象