我有一個asp.net-mvc網站,我正在使用LinFu做IOC。我遇到了一些問題,其中一些操作具有我要注入到控制器中的依賴項,但是如果我調用依賴於該操作的操作,我只想初始化依賴項。有沒有更好的方法來做asp.net-mvc中的IOC?
所以在我的控制器我有我的控制器驗證碼:
public PersonController
{
private IPeopleImporter _peopleImporter;
public override void Initialize(LinFu.IoC.Interfaces.IServiceContainer source)
{
_peopleImporter= source.GetService<IPeopleImporter>();
base.Initialize(source);
}
public JsonResult GetDetails(int id)
{
var p = _peopleImporter.Get(id);
var personDetails = new {p.Id, p.FirstName, p.LastName, StandardId = p.StandardIdLogin, p.PersonNumber};
return Json(personDetails);
}
}
到initiatize PeopleImporter是相當昂貴的,所以我的問題是,我要解決兩兩件事:
我想使IPeopleImporter的implementatioo「可插拔」這樣我就可以在國際奧委會的界面到控制器
我有很多的動作,所以我不希望如果用戶從不調用需要它的特定操作,則開始IPeopleImporter的開銷。這似乎是在上面的代碼,我這樣做,initiatization上PersonController的每一個電話
我initiatization代碼是這樣的:
this.AddService(typeof(IPeopleImporter), typeof(DatabaseImporter), LifecycleType.Singleton);
這似乎是常見的模式/問題。有沒有推薦的解決方案。在此期間,替代方案(以避免性能打擊是簡單的「新」的內置控制器內置(並避免國際奧委會)?
我不知道LinFu,但許多其他IOC框架提供工廠注入,可用於在需要時實例化實例。 – Eranga 2012-07-25 03:47:42
你所顯示的不是IoC。你一定在這裏混淆了這些條款。在IoC中,控制器將依賴關係作爲構造函數參數。在你的例子中,你將你的控制器綁定到DI框架(你的情況下是LinFu),並且你正在使用Service Locator模式(在Initialize方法中,你正在查詢你的DI框架來檢索依賴關係)。這被認爲是反模式。 IoC中的 – 2012-07-27 13:08:04