我有一個ASP.NET MVC 3應用程序,它使用Ninject.MVC3擴展在我的MVC應用程序中設置DI。也就是說,App_Start
文件夾中有NinjectMVC3.cs
文件,在該文件夾中定義了我的綁定。這適用於DI進入我的應用程序的控制器。在ASP.NET MVC 3應用程序的類庫中引用Ninject
除了ASP.NET MVC Web應用程序,我的解決方案還包含一個類庫項目,我們稱之爲MyProject.Core
,它具有我的域模型,服務等。在那裏,我有一個名爲UserServices
類,使用稱爲EmailServices
服務,像這樣:
public class UserServices : IUserServices
{
private readonly IEmailServices _emailServices = new EmailServices();
public void CreateUser(...)
{
// Create user...
_emailServices.SendWelcomeEmail(newUser);
}
}
正如你所看到的,UserServices
類對EmailServices
硬編碼的依賴,但我想爲實現這一目標也要配置爲使用DI。也就是說,在我的ASP.NET MVC應用程序(或單元測試項目或任何地方)中,我希望能夠說「綁定IEmailServices
以使用TestEmailServices
」,並且UserServices
類使用TestEmailServices
而不是EmailServices
。
我該如何去做這件事?我希望能夠做這樣的事情:
public class UserServices : IUserServices
{
private readonly IEmailServices _emailServices = kernel.Get<EmailServices>();
...
}
但我不知道在哪裏kernel
是從哪兒來,在這種情況下。我在問什麼是有意義的,還是我在這裏咆哮錯誤的樹?
感謝
是的,這是答案。不要將Ninject內核用作服務定位器。不要將你的庫實現與Ninject耦合。讓它在主應用程序中構造整個對象樹。 – Aaronaught
啊,我應該試試看! <拍額頭/> :-)謝謝 –