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

asp.net-mvc – EF上下文管理

发布时间:2020-12-16 04:10:49 所属栏目:asp.Net 来源:网络整理
导读:使用MVC应用程序时,管理Entity Framework上下文的最佳方法是什么? 我正在使用存储库/服务模式. 编辑 在查看其中一些问题之后:stackoverflow.com/users/587920/sam-striano,我之前更加困惑.有人说使用每个存储库的上下文,但是如果我想在一个控制器方法中使
使用MVC应用程序时,管理Entity Framework上下文的最佳方法是什么?

我正在使用存储库/服务模式.

编辑

在查看其中一些问题之后:stackoverflow.com/users/587920/sam-striano,我之前更加困惑.有人说使用每个存储库的上下文,但是如果我想在一个控制器方法中使用多个存储库呢?

为了遵循良好的分离设计,如何在MVC应用程序中使用UnitOfWork而不依赖于EF?我希望能够使用模拟上下文对我的控制器,模型,服务等进行单元测试?

解决方法

使用依赖注入器/反转控制框架,如:

> Ninject
> Autofac
> StructureMap
>团结

使用IoC容器,您可以告诉它如何管理单个数据上下文(最常见的是,每个请求).当您为每个请求设置数据上下文时,容器将自动神奇地为每个请求提供需要数据上下文相同数据上下文的任何类.

这是设置Ninject的good article.

假设您正在使用通用存储库,那么您的代码最终会看起来像什么:

Ninject模块:

public class NinjectRegistrationModule : NinjectModule
{
    public override void Load()
    {
        Bind<MyDataContext>().ToSelf().InRequestScope();
        Bind(typeof(RepositoryImplementation<>)).ToSelf().InRequestScope();

    }
}

通用存储库:

public RepositoryImplementation<T> : IRepository<T> where T : class
{
    MyDataContext _dataContext;

    public RepositoryImplementation<T>(MyDataContext dataContext)
    {
        _dataContext = dataContext;
    }

    // bunch of methods that utilize _dataContext
}

服务类别:

public class MyServiceClass
{
    IRepository<SomeEntity> _someEntityRepository;

    public MyServiceClass(IRepository<SomeEntity> someEntityRepository)
    {
        _someEntityRepository = someEntityRepository;
    }

    // do stuff with _someEntityRepository = someEntityRepository;
}

控制器:

public class MyController
{
    MyServiceClass _myServiceClass;

    public MyController(MyServiceClass myServiceClass)
    {
        // Ninject will auto-magically give us a myServiceClass
        // which will Ninject will inject a repository into MyServiceClass's constructor
        _myServiceClass = myServiceClass;
    }

    public ActionResult MyAction()
    {
        // use _myServiceClass to do stuff
        return View();
    }
}

(编辑:李大同)

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

    推荐文章
      热点阅读