C# 实现存储库模式

C# 实现存储库模式,c#,asp.net-mvc,repository-pattern,C#,Asp.net Mvc,Repository Pattern,根据asp.net上的,它显示以下代码: using System; using ContosoUniversity.Models; namespace ContosoUniversity.DAL { public class UnitOfWork : IDisposable { private SchoolContext context = new SchoolContext(); private GenericRepository<De

根据asp.net上的,它显示以下代码:

using System;
using ContosoUniversity.Models;

namespace ContosoUniversity.DAL
{
    public class UnitOfWork : IDisposable
    {
        private SchoolContext context = new SchoolContext();
        private GenericRepository<Department> departmentRepository;
        private GenericRepository<Course> courseRepository;

        public GenericRepository<Department> DepartmentRepository
        {
            get
            {

                if (this.departmentRepository == null)
                {
                    this.departmentRepository = new GenericRepository<Department>(context);
                }
                return departmentRepository;
            }
        }

        public GenericRepository<Course> CourseRepository
        {
            get
            {

                if (this.courseRepository == null)
                {
                    this.courseRepository = new GenericRepository<Course>(context);
                }
                return courseRepository;
            }
        }

        public void Save()
        {
            context.SaveChanges();
        }

        private bool disposed = false;

        protected virtual void Dispose(bool disposing)
        {
            if (!this.disposed)
            {
                if (disposing)
                {
                    context.Dispose();
                }
            }
            this.disposed = true;
        }

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }
    }
}
使用系统;
使用ContosoUniversity.模型;
名称空间ContosoUniversity.DAL
{
公共类UnitOfWork:IDisposable
{
private SchoolContext=新建SchoolContext();
私人通用存储部门存储库;
私人普通储蓄课程储蓄;
公共一般存储部门存储库
{
得到
{
if(this.departmentRepository==null)
{
this.departmentRepository=新的GenericRepository(上下文);
}
返回部门存储库;
}
}
公共普通存储课程存储
{
得到
{
if(this.courseRepository==null)
{
this.courseRepository=新的通用存储(上下文);
}
回归过程假设;
}
}
公共作废保存()
{
SaveChanges();
}
私有布尔=假;
受保护的虚拟void Dispose(bool disposing)
{
如果(!this.disposed)
{
如果(处置)
{
context.Dispose();
}
}
这是真的;
}
公共空间处置()
{
处置(真实);
总干事(本);
}
}
}
每次我想添加一个新的数据库表时都必须编写代码吗?例如,如果我想添加一个StudentsRepository,我必须这样做(?):

private generic repository studentRepository;
公共一般报告研究报告
{
得到
{
if(this.studentRepository==null)
{
this.studentRepository=新的通用存储(上下文);
}
回归学习积极性;
}
}

如果我的数据库有50个表呢?我是否必须为所有50个用户编写此代码

您的问题的答案是“是”,工作单元应该包含访问所有可能存储库的属性


如果编写代码时遇到麻烦,请创建一个T4模板,并让该类自动生成。

如果您的数据库有50个表,您可以想象尝试维护一个存储库类吗?因此,您的答案是肯定的,我必须维护所有这些额外的代码,以促进存储库模式?我相信有人更适合回答这个问题,但根据我在有几十个表的系统中工作的经验,我会使用ORM工具(例如NHibernate),其中每个表至少由一个类表示。这是一个很大的开销,但您拥有正确管理它所需的粒度控制。我使用的是实体框架,但我认为存储库模式应该是一个额外的抽象层。只是不确定我的想法是否正确……存储库模式将开发人员从存储库实现的内部抽象出来,即保存到一个文件/数据库/云中的某个地方,但您仍然需要一些表示数据库或任何您要保存到的东西,在您的例子中,它是由实体框架管理的。编写初始代码并不是一个大问题,只是为这个看似冗余的抽象层维护这个更大的代码库!我不明白-存储库是多余的?你不必使用它。在C#中没有任何方法可以简化这一点,除非使其更容易,例如通过使用T4。我确实必须使用它,因为这是一个项目要求。我看不出这会有什么帮助,但既然我必须实现它,我就试着去理解它。谢谢你的帮助。好吧,你缺乏知识库背后的基本原理。最简单的情况是:根据存储库编码允许您更改数据访问层,例如,您可以在不更改上层代码的情况下切换到另一个ORM。如果没有存储库和直接针对EF编码,在将来的某个地方将EF更改为另一个ORM几乎是不可能的,或者至少是非常非常单调乏味的。如果永远不会从EF切换到另一个数据层,则可能不需要存储库。请注意,EF的数据上下文本身就是一个存储库!然后,您要做的是用另一个存储库包装它。但是,很多人(包括我自己)会告诉您,这是有道理的,数据访问技术的变化往往比您的业务代码更快。
private GenericRepository<Student> studentRepository;

public GenericRepository<Student> StudentRepository
{
    get
    {

        if (this.studentRepository == null)
        {
            this.studentRepository = new GenericRepository<Student>(context);
        }
        return studentRepository;
    }
}