数据访问层、业务逻辑层、表示层、业务实体层;
1、数据访问层的设计:首先定义一个接口,里面定义了对一张表或一个对象的增删改查操作,然后定义一个类去实现上面的接口;
2、业务逻辑层:同样先定义一个接口,里面定义各种业务逻辑,然后定义一个类去实现上面的接口;
3、表示层:引用业务逻辑层的接口,调用其中的方法;
4、业务实体层;
改进(1)
泛型的引入:首先在设计数据访问层时,第一个接口就定义为泛型接口
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace IData { public interface IData<T> { IList<T> GetAll(); } }
然后每个实体类去分别实现泛型接口:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using DomainTest; using IData; using System.Data.SqlClient; namespace IDataLLimpl { public class CustomerDataimpl:IData<Customer> { public IList<Customer> GetAll() { SqlConnection con = new SqlConnection(Connectionstring.str); SqlCommand cmd = new SqlCommand("select CustomerID,CompanyName from Customers", con); con.Open(); SqlDataReader reader = cmd.ExecuteReader(); IList<Customer> ls = new List<Customer>(); while (reader.Read()) { Customer c = new Customer(); c.CustomerId = reader[0].ToString (); c.CompanyName = reader[1].ToString (); ls.Add(c); } con.Close(); return ls; } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using IData; using DomainTest; using System.Data.SqlClient; using System.Configuration; namespace IDataLLimpl { public class ProductDataimpl:IData<Product> { public IList<Product> GetAll() { SqlConnection con = new SqlConnection(ConfigurationSettings.AppSettings["constr"]); SqlCommand cmd = new SqlCommand("select ProductId,ProductName from Products",con); con.Open(); SqlDataReader reader = cmd.ExecuteReader(); List<Product> ls = new List<Product>(); while (reader.Read()) { Product p = new Product(); p.Id = reader[0].ToString(); p.Productname = reader[1].ToString(); ls.Add(p); } con.Close(); return ls; } } }
这样一来数据访问层就基本实现了,如果以后需要增加业务对象,只需要直接继承和实现泛型接口,利于扩展,下面开始业务逻辑层的设计:
这里需要也需要一个接口,里面定义了一些泛型方法:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using DomainTest; namespace IBLL { public interface IBLLTest { IList<T> GetAll<T>(); } }
然后接着在另一个程序集里引用并实现这些泛型方法;
using System; using System.Collections.Generic; using System.Linq; using System.Text; using DomainTest; using IBLL; using IData; using IDataLLimpl; namespace Bllimpl { public class BllimplTest:IBLLTest { private IData<T> GetObj<T>( ) { if (typeof(T) == typeof(Product)) { return (IData<T>)new ProductDataimpl(); } else { return (IData<T>)new CustomerDataimpl(); } } public IList<T> GetAll<T>() { return GetObj<T>().GetAll(); } } }
客户端调用:
protected void Page_Load(object sender, EventArgs e) { IBLLTest h = new BllimplTest(); GridView1.DataSource = h.GetAll<Customer>(); GridView1.DataBind(); }
这样一个结构就算是基本完成了;引入泛型的好处是使得程序的扩展性更强,
另外添加工厂设计模式,通过 IoC 或者 "配置反射" 来获得具体的数据层DAL实现类,可以减少层之间的耦合,也便于数据系统的替换(多层加IOC模式);