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)的依赖,这有点违背了依赖注入的目的。
我正在尝试在 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)的依赖,这有点违背了依赖注入的目的。