在 MVC 3 应用程序中将 Entity Framework 4 与 Ninject 结合使用时,存储库和 EF 上下文的适当生命周期范围是什么?
我一直在使用默认的 InTransientScope,但质疑是否应该使用 InRequestScope。
public class MyController: Controller
{
private readonly IMyRepo _repo;
public MyController(IMyRepo repo)
{
_repo = repo;
}
public ActionResult Index()
{
var results = _repo.GetStuff();
return View(results);
}
}
忍者模块:
public class MyServices : NinjectModule
{
public overrride void Load()
{
Bind<IMyRepo>.To<MyRepo>();
Bind<MyContext>.ToSelf();
}
}
MyRepo:
public class MyRepo: IMyRepo
{
private readonly MyContext _context;
public MyRepo(MyContext context)
{
_context = context;
}
public IEnumerable GetStuff()
{
return _context.Entity;//query stuff
}
}
您的存储库可以是瞬态范围,但是,我会将上下文绑定在请求范围中。这样,您的所有存储库实例将共享相同的上下文。通过这种方式,您可以获得 ORM 的缓存和事务优势。
当前它在代码中的工作方式是,每当您请求一个新上下文时,都会创建一个新上下文。因此,如果您的控制器首先使用存储库,然后调用另一个模块,该模块又使用存储库。每个存储库都将具有不同的上下文实例。因此,实际上您现在只是将 ORM 用作连接管理器和 SQL 生成器。
这也可能产生意想不到的后果。想象一下如下代码:
public ActionResult MyAction(int id)
{
var entity = _repository.Get<Entity>(id);
entity.Prop = "Processing";
_module.DoStuff(id);
}
如果DoStuff方法,最终调用_repository.Get<Entity>(id);
同样,您的实体将有 2 个不同步的不同副本。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)