以前分析过Microsoft中另一个轻巧的三层结构的PetShop例子,发现PetShop还是比较好懂。这几天有空一直在看Duwamish的代码,参照了几篇分析Duwamish的文章。所以,这些天都会围绕这两个例子来学习,并写一些心得。

    首先,Duwamish分层为五层结构。Web层,业务外观层,业务规则层,业务实体层,数据访问层。

    业务实体层,里面实现的是各个实体的对象,用DataSet来表示,比如:Book对象,Custermer对象,Order对象等。建立该层以方便在其它各个层来传递数据(也就是说,各层传递数据是以DataSet来传递的)。另个,这个对象实体也与数据库中的库结构是对应的。

    抽取其中的一段代码来分析。以BookData.cs为例,在其中,就建立了Book这个类:

    
学习三层结构心得(一)public class BookData : DataSet
}
    

    一旦对象实体建立好,其余层皆可创建该类的一个对象用它来作数据传递。



    数据访问层:功能很简单,与数据库进行交互。无非就是几种操作: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;
            }
        }
}


首先,book类继承自IDisposable,它可以派生Dispose函数来自主释放资源(在这里是指释放数据库的链接)。另外,它有一个SqlDataAdapter的成员,就是用来让SqlCommand与DataSet进行互通的,DataSet就是我们上面所提到的业务实体的对象。

不难看出,Book数据层应该对数据库的操作就是按照种类来查找书,按bookid来查找某本书,按作者来查找某些书,按书号来查找书,等等,于是我们在数据库中写入相应的存储过程(GetBooksByCategoryId,GetBookById,GetBooksByAuthor,GetBooksByISBN),然后,在源代码中调用如下:

学习三层结构心得(一)public BookData GetBooksByCategoryId(int categoryId)
        }


以上就是数据层做的事。

至于业务规则层与业务外观层,暂时没看到,续...

相关文章:

  • 2021-04-15
  • 2022-12-23
  • 2021-11-16
  • 2021-09-13
  • 2022-12-23
  • 2021-04-12
  • 2021-04-01
  • 2021-11-08
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-12-12
  • 2021-09-04
  • 2021-07-28
相关资源
相似解决方案