zoukankan      html  css  js  c++  java
  • 和我一起学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/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    计算几何
    HDU 4267
    HDU 4277
    NYOJ 123(插线问点)
    Set
    HDU 1792
    从文本文件读取数据到用vector实现的二维数组中
    为什么计算机采用二进制而不是八进制或者十六进制
    Google C++编程风格指南1
    编程中的命名设计
  • 原文地址:https://www.cnblogs.com/lonely7345/p/1662776.html
Copyright © 2011-2022 走看看