2017-05-30 38 views
0

我想在ASP.NET MVC項目中使用Ninject。這是我使用實體框架爲我的項目 - 計劃Ninject與基本控制器類中的實體框架

//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(); 

但says-

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在項目中工作?

回答

0

什麼,通常會出現的是你的接口綁定到實現它的具體類型,即:

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

你不需要創建結合能夠注入的服務爲每一位消費者(即BaseController)。你可以在構造函數中使用綁定(構造函數注入),或者在你的示例中使用[Inject](屬性注入或setter注入)來裝飾屬性

你需要爲你的DbContext創建一個綁定:

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

,然後它會注入到你的控制器構造函數,而是從BaseController獲得所有控制器都需要有一個構造器,對於要求的DbContext作爲參數

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

但是請注意,您正在創建對具體實現(DbContext)的依賴關係,這種做法有損於依賴注入的目的。