首先,Duwamish分层为五层结构。Web层,业务外观层,业务规则层,业务实体层,数据访问层。
业务实体层,里面实现的是各个实体的对象,用DataSet来表示,比如:Book对象,Custermer对象,Order对象等。建立该层以方便在其它各个层来传递数据(也就是说,各层传递数据是以DataSet来传递的)。另个,这个对象实体也与数据库中的库结构是对应的。
抽取其中的一段代码来分析。以BookData.cs为例,在其中,就建立了Book这个类:
一旦对象实体建立好,其余层皆可创建该类的一个对象用它来作数据传递。
数据访问层:功能很简单,与数据库进行交互。无非就是几种操作:Query,Update,Insert,Delete,当然,要根据数据库的设计,由程序应用提升出来的数据操作抽象来写出怎么与数据库进行哪些操作。还是看代码,看看DataAccess中的Book类怎么进行与数据库操作。
public class Books : IDisposable
{
private SqlDataAdapter dsCommand;
public Books()
{
dsCommand = new SqlDataAdapter();
dsCommand.SelectCommand = new SqlCommand();
dsCommand.SelectCommand.Connection = new SqlConnection(DuwamishConfiguration.ConnectionString);
dsCommand.TableMappings.Add("Table", BookData.BOOKS_TABLE);
}
/// <summary>
/// Dispose of this object's resources.
/// </summary>
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(true); // as a service to those who might inherit from us
}
/// <summary>
/// Free the instance variables of this object.
/// </summary>
protected virtual void Dispose(bool disposing)
{
if (! disposing)
return; // we're being collected, so let the GC take care of this object
if (dsCommand != null )
{
if (dsCommand.SelectCommand != null)
{
if( dsCommand.SelectCommand.Connection != null)
dsCommand.SelectCommand.Connection.Dispose();
dsCommand.SelectCommand.Dispose();
}
dsCommand.Dispose();
dsCommand = null;
}
}
}
{
private SqlDataAdapter dsCommand;
public Books()
{
dsCommand = new SqlDataAdapter();
dsCommand.SelectCommand = new SqlCommand();
dsCommand.SelectCommand.Connection = new SqlConnection(DuwamishConfiguration.ConnectionString);
dsCommand.TableMappings.Add("Table", BookData.BOOKS_TABLE);
}
/// <summary>
/// Dispose of this object's resources.
/// </summary>
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(true); // as a service to those who might inherit from us
}
/// <summary>
/// Free the instance variables of this object.
/// </summary>
protected virtual void Dispose(bool disposing)
{
if (! disposing)
return; // we're being collected, so let the GC take care of this object
if (dsCommand != null )
{
if (dsCommand.SelectCommand != null)
{
if( dsCommand.SelectCommand.Connection != null)
dsCommand.SelectCommand.Connection.Dispose();
dsCommand.SelectCommand.Dispose();
}
dsCommand.Dispose();
dsCommand = null;
}
}
}
首先,book类继承自IDisposable,它可以派生Dispose函数来自主释放资源(在这里是指释放数据库的链接)。另外,它有一个SqlDataAdapter的成员,就是用来让SqlCommand与DataSet进行互通的,DataSet就是我们上面所提到的业务实体的对象。
不难看出,Book数据层应该对数据库的操作就是按照种类来查找书,按bookid来查找某本书,按作者来查找某些书,按书号来查找书,等等,于是我们在数据库中写入相应的存储过程(GetBooksByCategoryId,GetBookById,GetBooksByAuthor,GetBooksByISBN),然后,在源代码中调用如下:
以上就是数据层做的事。
至于业务规则层与业务外观层,暂时没看到,续...