Ninject 与 Entity Framework 在基础控制器中 class

Ninject with Entity Framework in a base controller class

我正在尝试在 ASP.NET MVC 项目中使用 Ninject。这是我的项目使用 entity framework 的计划-

//Web.config 
<connectionStrings>
   <add name="MyTestDbEntities" connectionString="...." />
</connectionStrings>

//Base controller
public abstract class BaseController : Controller
{
    protected readonly MyTestDbEntities Db;
    public BaseController() { }
    public BaseController(MyTestDbEntities context)
    {
        this.Db = context;
    }
}

public class HomeController : BaseController
{
    public ActionResult Index()
    {
        Db.Students.Add(new Student() { StudentName="test"});
        Db.SaveChanges();
        return View();
    }
}

我想按如下方式使用Ninject-

kernel.Bind<MyTestDbEntities>().To<BaseController>().InRequestScope();

但是它说-

The type 'NinjectTest.BaseController' cannot be used as type parameter 
'TImplementation' in the generic type or method 
'IBindingToSyntax<MyTestDbEntities>.To<TImplementation>()'. 
There is no implicit reference conversion from 'NinjectTest.BaseController' 
to 'NinjectTest.Models.MyTestDbEntities'.   

能否建议我如何配置 Ninject 以在项目中工作?

通常发生的情况是将接口绑定到实现它的具体类型,即:

kernel.Bind<IMyService>().To<MyServiceImpl>();

您无需创建绑定即可将服务注入每个消费者(即 BaseController)。您可以通过在构造函数中请求绑定(构造函数注入)或使用 [Inject] 装饰 属性(属性 注入或 setter 注入)

在您的示例中,您需要为 DbContext 创建绑定:

kernel.Bind<MyTestDbEntities>().ToSelf().InRequestScope();

然后它将被注入到您的 Controller 构造函数中,但是所有从 BaseController 派生的 Controller 都需要具有请求 DbContext 作为参数的构造函数

public HomeController(MyTestDbEntities db) : base(db) { }

但是,请注意您正在创建对具体实现(DbContext)的依赖,这有点违背了依赖注入的目的。