zoukankan      html  css  js  c++  java
  • CSLA.Net学习(1)——第一个小程序

    CSLA是什么东西啊!项目需要,需要学习一下!

    目前应用CSLA主要是为了验证数据,数据库开发的需要,要把程序结构分分层:数据实体Models、通用数据库操作Helper、数据操作DAL、业务逻辑BIL、系统界面UI;

    应用CSLA开发的第一个测试程序,Csla版本为4.3.10.0,好像和3.X版本的区别还是蛮大的:

    运行结果:

    首先需要CSLA的类库:Csla.dll,Csla.Windows.dll。

    包括Drill类,DrillList类和窗体类From1。

    Drill类:

    Drill类
      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 using System.Text;
      5 using System.ComponentModel;
      6 using System.Linq;
      7 using Csla;
      8 using Csla.Data;
      9 using Csla.Security;
     10 namespace Models
     11 {
     12     [Serializable]
     13     public class Drill :BusinessBase<Drill>
     14     {
     15           #region  Business Methods
     16 
     17         private   string aa;
     18         private static PropertyInfo<int> HoleIDProperty =
     19           RegisterProperty<int>(p => p.HoleID, "钻孔编号");
     20         public int HoleID
     21         {
     22             get { return GetProperty(HoleIDProperty); }
     23             set { SetProperty(HoleIDProperty, value); }
     24         }
     25 
     26         private static PropertyInfo<int> LayerIDProperty =
     27         RegisterProperty<int>(p => p.LayerID, "分层编号");
     28         public int LayerID
     29         {
     30             get { return GetProperty(LayerIDProperty); }
     31             set { SetProperty(LayerIDProperty, value); }
     32         }
     33 
     34 
     35         private static PropertyInfo<double> TopHeightProperty =
     36         RegisterProperty<double>(p => p.TopHeight, "顶板高度");
     37         public double TopHeight
     38         {
     39             get { return GetProperty(TopHeightProperty); }
     40             set { SetProperty(TopHeightProperty, value); }
     41         }
     42 
     43 
     44         public override string ToString()
     45         {
     46             return HoleID.ToString();
     47         }
     48 
     49         #endregion
     50 
     51         #region  Business Rules
     52 
     53         protected override void AddBusinessRules()
     54         {
     55             base.AddBusinessRules();
     56 
     57             BusinessRules.AddRule(new Csla.Rules.CommonRules.MinValue<int>(HoleIDProperty, 1));
     58             //BusinessRules.AddRule(new Csla.Rules.CommonRules.MinValue<int>(LayerIDProperty, 0));
     59             BusinessRules.AddRule(new Csla.Rules.CommonRules.MinValue<double>(TopHeightProperty, 0));
     60             BusinessRules.AddRule(new Csla.Rules.CommonRules.RegExMatch(LayerIDProperty, "^[0-9]*[1-9][0-9]*$", "要求类型为整形"));
     61         }
     62 
     63         #endregion
     64 
     65         #region  Factory Methods
     66 
     67         public static Drill NewOrder()
     68         {
     69             return DataPortal.Create<Drill>();
     70             //return new Drill();
     71         }
     72 
     73         public static Drill GetOrder(int id)
     74         {
     75             return DataPortal.Fetch<Drill>(id);
     76         }
     77 
     78         public static void DeleteOrder(int id)
     79         {
     80             DataPortal.Delete<Drill>(id);
     81         }
     82 
     83         public Drill()
     84         {
     85             MarkAsChild();
     86         }
     87         public Drill(int holeid ,int layerid):this()
     88         {
     89             using (BypassPropertyChecks)
     90             {
     91                 this.HoleID = holeid;
     92                 this.LayerID = layerid;
     93             }
     94         }
     95         #endregion
     96         protected override void AcceptChangesComplete()
     97         {
     98             System.Diagnostics.Debug.WriteLine(string.Format("Acc: {0} ({1}, {2})", HoleID, CurrentEditLevel, CurrentEditLevelAdded));
     99             base.AcceptChangesComplete();
    100         }
    101 
    102         protected override void UndoChangesComplete()
    103         {
    104             System.Diagnostics.Debug.WriteLine(string.Format("Und: {0} ({1}, {2})", HoleID, CurrentEditLevel, CurrentEditLevelAdded));
    105             base.UndoChangesComplete();
    106         }
    107 
    108         protected override void CopyStateComplete()
    109         {
    110             System.Diagnostics.Debug.WriteLine(string.Format("Beg: {0} ({1}, {2})", HoleID, CurrentEditLevel, CurrentEditLevelAdded));
    111             base.CopyStateComplete();
    112         }
    113         #region  Data Access
    114 
    115         public int CurrentEditLevel
    116         {
    117             get
    118             {
    119                 return EditLevel;
    120             }
    121         }
    122 
    123         public int CurrentEditLevelAdded
    124         {
    125             get
    126             {
    127                 Csla.Core.IEditableBusinessObject ebo = (Csla.Core.IEditableBusinessObject)this;
    128                 return ebo.EditLevelAdded;
    129             }
    130         }
    131         #endregion
    132     }
    133 }

    DrillList类:

    DrillList类
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Csla;
    namespace Models
    {
        class DrillList :BusinessBindingListBase<DrillList, Drill>
        {
        }
    }

    Form1窗体:

    From1窗体
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using Models;
    namespace MineGeologyV10._1._0
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                DrillList list = new DrillList();
                list.Add(new Drill(1, 1));
                list.Add(new Drill(2, 2));
                list.Add(new Drill(3, 3));
                list.Add(new Drill(4, 4));
                list.BeginEdit();
                this.bindingSource1.DataSource = list;
                this.bindingSource1.ListChanged += new ListChangedEventHandler(bindingSource1_ListChanged);
                this.dataGridView1.DataSource = bindingSource1;
            }
    
            void bindingSource1_ListChanged(object sender, ListChangedEventArgs e)
            {
                System.Diagnostics.Debug.WriteLine(
            string.Format("{0}: {1}, {2}", e.ListChangedType.ToString(), e.NewIndex, e.OldIndex));
            }
    
            private void dataGridView1_DataError(object sender, DataGridViewDataErrorEventArgs e)
            {
    
            }
        }
    }

    这里发现一个问题:Csla实现数据datagridview中的验证,如果是数据类型错误,DataGridView会弹出错误对话框,这时单元格没有失去焦点,也就是说此时的验证是在UI层的,没有发生在BIL层,没有通过Csla来实现验证。而只有失去焦点,数据存入DrillList类对象时才进行业务逻辑的验证。所有我将DataGridView的Data_Error事件处理了一下,这样就不会弹出对话框了,只是让光标无法离开单元格。
    原来我的单元格验证都是在DataGridView中进行的!这样的坏处是没有办法与界面分离。但是数据绑定的机制确实很复杂!!

    接下来要和数据库结合起来开发!

    文章未经说明均属原创,学习笔记可能有大段的引用,一般会注明参考文献。 欢迎大家留言交流,转载请注明出处。
  • 相关阅读:
    Python运行时遇到UnicodeDecodeError: 'ascii' codec can't decode byte 0xb0 in position 1: ordinal not in range(128)的问题
    Android 网络通信架构学习
    将Windows MyEclipse的web项目移植到Debian下
    build-essential : Depends: libc6-dev but it is not going to be installed or libc-dev 解决办法
    Debian可用的源 —— 23% waiting for headers解决办法
    将访问服务器的工作交由Service承担
    Servlet回传的数据显示在界面上
    Android客户端和Servlet服务器端通过JSON交互
    Welcome to My Blog!
    【三木夜话】无穷级的恐惧
  • 原文地址:https://www.cnblogs.com/yhlx125/p/2480972.html
Copyright © 2011-2022 走看看