和我一起学CSLA.NET----设计模型及数据访问

     上一节和大家说了些CSLA.NET的一些功能,以及对这些功能提出一些疑问,从这一节开始,我们就带着这些问题,来学习CSLA 框架怎么使用。我并不打算在这里介绍CSLA框架的一些概念,如果你对面向对象这些概念仍然不是很熟悉的话,建议你还是大概看一下作者的书,我们还是采用CSLA.NET来结合实际使用完成一个简单的例子. 
     有很多人是先把数据库建好了再来用CSLA来写业务代码,有的是用Codesmith根据数据库生成。其实说实话这也未尝不可,不管黑猫白猫抓到耗子就是好猫嘛,呵呵,不过我个人认为这并不是最合理的,起码你在设计数据库时也应该考虑一下CSLA的业务对象怎么写,尤其是要考虑这些对象之间的关系实现起来的难易度,否则会使你的CSLA过于复杂。
     为了尽量简单化,例子不会掺杂过多的业务,这样来更多的关注用CSLA.NET来实现的过程。我们就拿订单模型来做吧,先设计出整个领域对象:
      Domain Model
     主要包含订单,订单项,产品三个领域类,在这里暂时不考虑客户,而且我们现在也暂时不考虑权限控制,这部分在后面再加上来。我们对这几个对象再进行细化 :
     Domain Objects
     我想同行们对这样的一个设计都已经相当熟悉了,订单包含订单项的集合,订单项又会关联一个产品(物料),我们尽量少的字段,只保留一些有代表性的,日期,金额,枚举类型的字段。同样的,我们在这里也没有设计业务方法,先不管这些(这并不合理),我们在这个时候也可以把我们的数据库建立起来了(可以通过EA来生成脚本): 

隐藏行号 复制代码 创建表结构脚本
  1. USE [CSLATest]
  2. GO
  3. /****** Object:  Table [dbo].[Product]    Script Date: 02/02/2010 21:25:25 ******/
  4. SET ANSI_NULLS ON
  5. GO
  6. SET QUOTED_IDENTIFIER ON
  7. GO
  8. CREATE TABLE [dbo].[Product](
  9. [ProductID] [nvarchar](50) NOT NULL,
  10. [ItemNo] [nvarchar](20) NOT NULL,
  11. [ItemName] [nvarchar](50) NOT NULL,
  12. CONSTRAINT [PK_Product] PRIMARY KEY CLUSTERED 
  13. (
  14. [ProductID] ASC
  15. )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
  16. ) ON [PRIMARY]
  17. GO
  18. /****** Object:  Table [dbo].[OrderLine]    Script Date: 02/02/2010 21:25:25 ******/
  19. SET ANSI_NULLS ON
  20. GO
  21. SET QUOTED_IDENTIFIER ON
  22. GO
  23. CREATE TABLE [dbo].[OrderLine](
  24. [OrderLineID] [nvarchar](50) NOT NULL,
  25. [OrderID] [nvarchar](50) NOT NULL,
  26. [ProductID] [nvarchar](50) NOT NULL,
  27. [Num] [int] NULL,
  28. [Remark] [nvarchar](50) NULL,
  29. CONSTRAINT [PK_OrderLine] PRIMARY KEY CLUSTERED 
  30. (
  31. [OrderLineID] ASC
  32. )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
  33. ) ON [PRIMARY]
  34. GO
  35. /****** Object:  Table [dbo].[Order]    Script Date: 02/02/2010 21:25:25 ******/
  36. SET ANSI_NULLS ON
  37. GO
  38. SET QUOTED_IDENTIFIER ON
  39. GO
  40. CREATE TABLE [dbo].[Order](
  41. [OrderID] [nvarchar](50) NOT NULL,
  42. [OrderDate] [datetime] NULL,
  43. [OrderType] [int] NULL,
  44. [EffecDateBegin] [datetime] NULL,
  45. [EffecDateEnd] [datetime] NULL,
  46. [OrderState] [int] NULL,
  47. [Amount] [decimal](18, 0) NULL,
  48. CONSTRAINT [PK_Order] PRIMARY KEY CLUSTERED 
  49. (
  50. [OrderID] ASC
  51. )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
  52. ) ON [PRIMARY]
  53. GO
  54. 
    

     

接下来,我们必须要做一个选择,那就是CSLA.Net的数据访问使用什么实现,之前的版本一般都是使用存储过程,Sql语句,还有的使用开源的ORM,比如NHibernate等,现在使用Linq的比较多,不过个人认为Linq to Sql或者EF和CSLA.Net还是有重叠的部分,使用时就会涉及到Linq的对象与CSLA业务对象属性的映射的问题,(不过即使你使用存储过程,你也要处理DataSet或者DataReader与你的对象的转换).我们同样也使用Linq To Sql来实现数据门户, 在这个例子中我们并不打算象官方Demo那样使用存储过程来实现业务逻辑,而是都由Linq to Sql来实现.
     先建立起我们的Linq项目CSLADemo.DalLinq,在这里需要进行一下设置,工具--选项--数据库工具--O/R Designer--名称的复数形式设置为True.然后拖动我们的三个表,并根据我们的模型建立他们之间的关联关系,当然,你也可以在数据库表中建立外键,那样的拖动的话这样的关系就会自动生成。
     2010-2-3 13-58-54

     注意我们Order与OrderLine之间,是一对多关系,双向生成属性,OrderLine与Product之间一对多,Product不需要生成属性。
     我们说一下Linq的一些题外话,其实Linq这个设计器就是比较典型的DSL+T4的例子,dbml文件主要是描述元数据文件,CSLADemo.designer.cs文件就是T4模板结合元数据生成的目标代码,我们甚至可以控制这个步骤,通过自己的模板文件,将目标代码生成的单独的类里面,而不是象现在这样,将所有的代码都生成都一个类里,不过这在我们这个例子里是没有必要的,因为我们并不打算去扩展linq to sql生成的代码,而只是简单的使用就足够了。
     另外还有一点需要提的就是,在这里建立的对象与对象的关系其实也是很关键的,在后面我们可以看到,我们在CSLA对象中其实是利用这些关系来加载相关联的对象,也就是通过Linq对象来实现的。
    
    到现在为止我们还没有介绍直接与CSLA相关的东西,不过我们已经完成了整个环境的准备,以及数据访问的完成,下一节我们来介绍CSLA的具体使用.

作者:孤独侠客似水流年
出处:http://lonely7345.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

posted @ 2010-02-03 16:33  孤独侠客  阅读(7827)  评论(11编辑  收藏  举报