加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – MVC中Ninject的适当存储库LifeCycle Scope

发布时间:2020-12-16 06:37:06 所属栏目:asp.Net 来源:网络整理
导读:在MVC 3应用程序中将Entity Framework 4与Ninject一起使用时,存储库和EF上下文的相应LifeCycle Scope是什么? 我一直在使用默认的InTransientScope,但质疑它是否应该是InRequestScope. public class MyController: Controller { private readonly IMyRepo _r
在MVC 3应用程序中将Entity Framework 4与Ninject一起使用时,存储库和EF上下文的相应LifeCycle Scope是什么?

我一直在使用默认的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);
   }
 }

Ninject模块:

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个不同的实体副本.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读