在Repository,Generic repository&存储库之间传递Context对象。工作单位

时间:2015-01-15 01:31:02

标签: asp.net-mvc entity-framework repository entity-framework-6 unit-of-work

我正在开发一个asp.net mvc web应用程序&实体框架6.我希望在我的应用程序中包含这些: -

  1. 通用存储库类。

  2. 每种实体类型的专用存储库类。此专用存储库将从通用存储库派生。

  3. 拥有一个工作单元,它将在专用存储库之间进行协调,以便将存储库中的所有操作包装到单个数据库事务中。

  4. Generic存储库是: -

    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 interface ISkillTypeRepository {
    
    
    
        }
    }
    

    专用存储库之一: -

    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();
            }
        }
    

    工作单元

    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());
          }
    

    所以我的问题基本上是关于我是否在专用存储库&gt;&gt;通用存储库&gt;&gt;工作单元之间正确传递Context对象。那么多个存储库中的所有操作都将被包装到单个数据库事务中?

    有人可以提出建议吗?

1 个答案:

答案 0 :(得分:0)

我认为只删除所有存储库中的private SkillManagementEntities db = new SkillManagementEntities();就足够了。

您已经有一个上下文private SkillManagementEntities db = new SkillManagementEntities();是您的工作单位。只需将其传递给您的所有存储库,不要在任何存储库中创建新的上下文。