【问题标题】:Issue with binding the interface to class Ninject将接口绑定到类 Ninject 的问题
【发布时间】:2014-08-23 04:03:37
【问题描述】:

我有一个界面:

public interface IRepository<T>
    where T : Entity
{
    T Add(T entity);
    T Delete(int id);
    T Get(int id);
    T Update(T entity);
    IQueryable<T> Items { get; }
}

和类:

public class EfRepository<T> : IRepository<T> where T : Entity

但是,我在绑定它们时遇到了问题,所以这里是绑定代码,它一直突出显示

private void AddBindings()
    {
        ninjectKernel.Bind<IRepository<T>>().To<EfRepository<T>>();
    }

【问题讨论】:

  • 听起来很明显,在您创建绑定的范围内无法识别 T。
  • @Complexity,你能帮我写代码吗,我该怎么做才能让我的代码正常工作?我将不胜感激。
  • 我已经添加了一个答案,但它未经测试,请试一试。

标签: c# asp.net-mvc ninject


【解决方案1】:

这是因为在您创建绑定的类中,它不知道 T。

您正在寻找的是绑定开放泛型。 这可以通过以下方式实现:

Bind(typeof(IGeneric<>)).To(typeof(Generic<>));

试一试,我想它应该可以工作(但是,它未经测试)。

在您的情况下,这意味着您的代码将如下所示:

private void AddBindings()
{
    ninjectKernel.Bind(typeof(IRepository<>)).To(typeof(EfRepository<>));
}

【讨论】:

  • 我尝试编辑答案(但一些审阅者似乎对 c# 不太熟悉并拒绝了编辑)。那么你能自己调整一下这个例子吗? (将Bind&lt;IRepository&lt;&gt;&gt;() 更改为Bind(typeof(IRepository&lt;&gt;))。谢谢。
  • 谢谢,很酷。我冒昧地修复了括号,因为它们还不是很完美;-)
  • 没问题。我是在没有电脑的情况下写的,所以无法测试。