我有一个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