使用 LINQ to SQL采用 Repository 模式实现三层架构

51jian

贡献于2012-07-18

字数:0 关键词: .NET开发 SQL

使用 LINQ to SQL 采用 Repository 模式实现三层架构 前两天写了一篇《LINQ to SQL 实现简单的三层架构》,今天将对其改造一下,在其中 加入一些新的东西,就是 Repository 模式(翻译为仓储模)。我们还是以 Employee 数据 表做为演示。 首先,我们还是创建一个数据库 Test,然后建立一个 Employee 的信息表,表里的字 段有: ID int 主键 FirstName nvarchar(50) LastName nvarchar(50) 接下来,我们就可以开始模型层的创建了。 模型层(实体类层) [Table(Name = "Employee")] public class Employee { [Column(IsPrimaryKey = true, IsDbGenerated = true)] public int ID { get; set; } [Column] public string FirstName { get; set; } [Column] public string LastName { get; set; } } 这一层的代码是参看 Linq Mapping 的规则迚行定义的。没有什么特别可说的。 接下来,我们就开始用 Repository 模式来构建数据访问层。 数据访问层 我们先将常用的增加、删除等方法提取为 Irepository 接口,代码如下: public interface IRepository where T : class { IEnumerable FindAll(Func exp); void Add(T entity); void Delete(T entity); void Save(); } 下面我们创建一个泛型类来实现 IRepository 接口,具体的代码如下: public class Repository : IRepository where T : class { protected CustomDataContext _dataContext; public Repository(CustomDataContext dataContext) { this._dataContext = dataContext; } public IEnumerable FindAll(Func exp) { return _dataContext.GetTable().Where(exp); } public void Add(T entity) { _dataContext.GetTable().InsertOnSubmit(entity); } public void Delete(T entity) { _dataContext.GetTable().DeleteOnSubmit(entity); } public void Save() { _dataContext.SubmitChanges(); } } 实现过程中,我们调用了一个 CustomDataContext 的泛型类,这个数据场景类是我们自 定义的,它继承了 DataContext 类,代码如下: public class CustomDataContext : DataContext where TEntity : class { public Table Entities; public CustomDataContext(string connectionString) : base(connectionString) { } } 上面我们已经实现了公共的数据访问,但对于实体,它还会有其他的一些符合自己的逻辑, 所以我们需要单独定义一个具体实体类的接口,如: public interface IEmployeeRepository : IRepository { IList GetAllEmployeeById(int id); } 定义好接口以后,我们就该来实现它了,代码如下: public class EmployeeRepository : Repository, IEmployeeRepository { private static string connectionString = ConfigurationManager.ConnectionStrings["defaultConnection"].ConnectionString; private static CustomDataContext dataContext = new CustomDataContext(connectionString); public EmployeeRepository() : base(dataContext) { } public IList GetAllEmployeeById(int id) { var listEmployee = from c in _dataContext.GetTable() where c.ID == id select c; return listEmployee.ToList(); } } 到此,我们已经实现了 Employee 实体的数据访问,数据访问层的功能基本上就完成了。 接下来我们就该来编写业务逻辑层的代码了。 业务逻辑层 业务逻辑层的主要实现们具体的一些业务逻辑,但对于 Employee 这个很普通的对象来说, 它基本的操作无非就是增、删、查、改,所以从这些看来,这层似乎就是数据访问层的一层 封装,和数据访问层没有太大的区别。但如果我们换成银行存取款的例子的话,那情况就丌 一样,因为里面就会有是否可以取款、是否可以转帐等逻辑判断。接下来,我们还是来看业 务逻辑层的代码: public class EmployeeBLL { EmployeeRepository repository = new EmployeeRepository(); public IEnumerable FindAll(Func exp) { return repository.FindAll(exp); } public void Add(Employee employee) { repository.Add(employee); repository.Save(); } public void Delete(int id) { var list = from c in FindAll(x => x.ID == id) select c; var employee = list.FirstOrDefault(); repository.Delete(employee); repository.Save(); } public void Update(Employee employee) { var em = Find(employee.ID); if (em != null) { ObjectPropertyValueSetting.SetValue(em, employee); repository.Save(); } } public Employee Find(int id) { var list = from c in FindAll(x => x.ID == id) select c; return list.FirstOrDefault(); } public IList GetAllEmployeeById(int id) { return repository.GetAllEmployeeById(id); } } 好了,业务逻辑层的功能我们也完成了。现在就剩下表现层了。 表现层 表现层的东西就相对简单了很多,就是在页面上放四个按钮,分别是增、删、改、查,让它 们分别来调用 Add、Update、Delete‘Find 方法,然后在页面加载时,再调用一个获取 信息列表的方法,即 FindAll。大家可能会问你还有 GetAllEmployeeById 的方法没有调用 呀,是的,这是我们为了展示架构所用的,在这里就丌建立页面调用了。好了,我们来看一 下具体的代码: Test.aspx 的代码如下:
ID:<%# Eval("ID") %> FirstName:<%# Eval("FirstName") %> LastName:<%# Eval("LastName") %>
Test.aspx.cs 的代码内容如下: public partial class Test: System.Web.UI.Page { private EmployeeBLL employeeBLL; protected void Page_Load(object sender, EventArgs e) { employeeBLL = new EmployeeBLL(); if (!IsPostBack) { GetList(); } } private void GetList() { rpt.DataSource = employeeBLL.FindAll(x => x.ID > 0); rpt.DataBind(); } protected void btnAdd_Click(object sender, EventArgs e) { Employee employee = new Employee(); employee.FirstName = "bruce"; employee.LastName = "lee"; employeeBLL.Add(employee); Response.Redirect("Test.aspx", true); } protected void btnUpdate_Click(object sender, EventArgs e) { Employee employee = new Employee(); employee.ID = 5; employee.FirstName = "bruce"; employee.LastName = "lee updated"; employeeBLL.Update(employee); Response.Redirect("Test.aspx", true); } protected void btnDelete_Click(object sender, EventArgs e) { employeeBLL.Delete(7); Response.Redirect("Test.aspx", true); } protected void btnExist_Click(object sender, EventArgs e) { Employee employee = employeeBLL.Find(5); if (employee != null) { ltlResult.Text = string.Format(@"ID:{0} FirstName:{1} LastName:{2}", employee.ID, employee.FirstName, employee.LastName); } } } OK,到此为止三层架构就算实现了,运行一下页面,就可以看到结果了,如图所示:

下载文档,方便阅读与编辑

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享文档获得金币 ] 0 人已下载

下载文档

相关文档