Asp.net mvc 在存储库、通用存储库和;工作单位
我正在开发asp.net mvc web应用程序&实体框架6。我希望在我的应用程序中包含以下内容:-Asp.net mvc 在存储库、通用存储库和;工作单位,asp.net-mvc,entity-framework,repository,entity-framework-6,unit-of-work,Asp.net Mvc,Entity Framework,Repository,Entity Framework 6,Unit Of Work,我正在开发asp.net mvc web应用程序&实体框架6。我希望在我的应用程序中包含以下内容:- 通用存储库类 每个实体类型的专用存储库类。此专用存储库将从通用存储库派生 有一个工作类单元,它将在专用存储库之间进行协调,因此存储库中的所有操作都将打包到单个数据库事务中 通用存储库是:- namespace SkillManagement.DAL { public class GenericRepository<TEntity> where TEntity : class
namespace SkillManagement.DAL
{
public class GenericRepository<TEntity> where TEntity : class
{
internal SkillManagementEntities context;
internal DbSet<TEntity> dbSet;
public GenericRepository(SkillManagementEntities context)
{
this.context = context;
this.dbSet = context.Set<TEntity>();
}//code goes here...
专用存储库之一:-
namespace SkillManagement.DAL
{
public class SkillTypeRepository : GenericRepository<SkillType> , ISkillTypeRepository ,IDisposable
{
private SkillManagementEntities db = new SkillManagementEntities();
public SkillTypeRepository(SkillManagementEntities db)
: base(db)
{
}
public void Dispose()
{
db.Dispose();
}
public void Save()
{
db.SaveChanges();
}
}
然后在我的控制器内,我将被称为工人阶级的联合体,如下所示:-
public class SkillTypeController : Controller
{
private UnitOfWork unitOfWork = new UnitOfWork();
//
// GET: /Course/
public ViewResult Index()
{
var skilltype = unitOfWork.SkillTypeRepository.Get();
return View(courses.ToList());
}
因此,我的问题基本上是关于我是否在专用存储库>>通用存储库>>工作单元之间正确传递上下文对象。那么来自多个存储库的所有操作都将打包到一个db事务中
有人能给我一些建议吗?我想只要删除
私有的SkillManagementEntities db=new SkillManagementEntities()代码>在所有存储库中就足够了
您已经有了一个单独的上下文private SkillManagementEntities db=new SkillManagementEntities()代码>是您的工作单元。只需将其传递给所有存储库,不要在任何存储库中创建新的上下文。EF6已经为您提供了所需的一切。为什么要在一个附加的、不必要的层中重新包装呢?我之前已经讨论过这个问题了。现在我知道EF充当存储库和工作单元。现在,我希望使用Repository不是为了实现简单的CRUD操作,而是能够跨控制器类重用代码,主要是为了重用具有连接多个表的复杂查询的方法。我将为每种实体类型创建多个回购,可能是一个回购。。为了能够在多个回购之间进行协调,我决定创建一个unite of work类,以便将所有回购操作包装在一个事务中。我知道EF可以作为CRUD操作的回购和unitofwork,但在我的例子中,我有一个复杂的数据访问层,我希望能够重用它……您需要的是一个服务层,而不是一个额外的重新存储层。例如,请参见,可能我们讨论的是同一件事,但名称不同,我试图实现的是不从控制器类调用DBContext对象。要从服务层或存储库执行此操作,请使用工作单元将服务层协调在一起。。。但我的问题是如何在两个对象之间传递名称db context object;抽象回购+专用回购+工作单元+控制器。您可以转告我吗?谢谢您的回复,但是如果我删除skillType Repo中的“private SkillManagementEntities db=new SkillManagementEntities();”,那么下面的“db.Dispose();”将不起作用。。。
namespace SkillManagement.DAL
{
public class UnitOfWork : IDisposable
{
private SkillManagementEntities db = new SkillManagementEntities();
private SkillTypeRepository skillTypeRepository;
private Repository2 repository2;
private Repository3 repository3;
// code goes here....
public SkillTypeRepository SkillTypeRepository
{
get
{
if (this.skillTypeRepository == null)
{
this.skillTypeRepository = new SkillTypeRepository(db);
}
return skillTypeRepository;
}
}
//code goes here for repository2 , repository3 , etc..
public void Save()
{
db.SaveChanges();
}
public class SkillTypeController : Controller
{
private UnitOfWork unitOfWork = new UnitOfWork();
//
// GET: /Course/
public ViewResult Index()
{
var skilltype = unitOfWork.SkillTypeRepository.Get();
return View(courses.ToList());
}