基于NBear的Domain层设计
        
        NBear是Teddy开发的快速开发框架,在之前的5个示例中,主要演示了主要的框架功能和业务领域模型不太复杂情形下忽略领域层的应用范例。但是,当业务模型相对复杂,单纯基于简单实体的强类型数据访问接口,可能就会使得太多的业务逻辑被分散到service或facade层,此时,我们就最好加一层独立的业务领域模型层来封装实体和强类型接口的使用。本文为您演示基于NBear v1.6.0中新增的NBear.Domain的领域模型设计示例。
    
NBear是Teddy开发的快速开发框架,在之前的5个示例中,主要演示了主要的框架功能和业务领域模型不太复杂情形下忽略领域层的应用范例。但是,当业务模型相对复杂,单纯基于简单实体的强类型数据访问接口,可能就会使得太多的业务逻辑被分散到service或facade层,此时,我们就最好加一层独立的业务领域模型层来封装实体和强类型接口的使用。本文为您演示基于NBear v1.6.0中新增的NBear.Domain的领域模型设计示例。
下载源码及示例
您可以从这里下载NBear最新版本及Sample6源码
NBear.Domain
NBear.Domain主要为您提供了基类DomainModel和GuidKeyDomainModel,前者用于采用自增长ID主键的实体,后者用于采用Guid主键的实体。只需将他们作为你的领域类的基类,它就能提供最基本的领域类需要的CRUD等功能(包括Save, Delete, Find, FindAll等),您可以方便的以此为基础进行扩展。

 DomainModel.cs
DomainModel.cs1
 using System;
using System;2
 using System.Data;
using System.Data;3
 using System.Data.Common;
using System.Data.Common;4
 using System.Collections.Generic;
using System.Collections.Generic;5
 using System.Text;
using System.Text;6
 using NBear.Common;
using NBear.Common;7
 using NBear.Data;
using NBear.Data;8

9
 namespace NBear.Domain
namespace NBear.Domain10


 {
{11
 public interface IDomainModel<IEntityType, IEntityViewType>
    public interface IDomainModel<IEntityType, IEntityViewType>12
 where IEntityType : IEntity
        where IEntityType : IEntity13
 where IEntityViewType : IEntity
        where IEntityViewType : IEntity14

 
     {
{15
 void Save();
        void Save();16
 void Save(DbTransaction tran);
        void Save(DbTransaction tran);17
 void LoadFromEntity(IEntityViewType entity);
        void LoadFromEntity(IEntityViewType entity);18

 object ID
        object ID  { get; }
{ get; }19
 }
    }20

21
 public abstract class DomainModel<IEntityType, IEntityViewType, DomainType> : IDomainModel<IEntityType, IEntityViewType>
    public abstract class DomainModel<IEntityType, IEntityViewType, DomainType> : IDomainModel<IEntityType, IEntityViewType>22
 where IEntityType : IEntity
        where IEntityType : IEntity23
 where IEntityViewType : IEntity
        where IEntityViewType : IEntity24
 where DomainType : IDomainModel<IEntityType, IEntityViewType>, new()
        where DomainType : IDomainModel<IEntityType, IEntityViewType>, new()25

 
     {
{26

 Protected Members#region Protected Members
        Protected Members#region Protected Members27

28
 protected IEntityType entityValue;
        protected IEntityType entityValue;29
 protected IEntityType entityValue2;
        protected IEntityType entityValue2;30
 protected IEntityViewType entityViewValue;
        protected IEntityViewType entityViewValue;31

32
 protected DomainModel()
        protected DomainModel()33

 
         {
{34
 entityValue = Gateway.Create<IEntityType>();
            entityValue = Gateway.Create<IEntityType>();35
 entityValue2 = Gateway.Create<IEntityType>();
            entityValue2 = Gateway.Create<IEntityType>();36
 }
        }37

38

 /**//// <summary>
        /**//// <summary>39
 /// override this method in sub class to customly load auto-created key column id if neccessary
        /// override this method in sub class to customly load auto-created key column id if neccessary40
 /// by default, when saving a new domain model, the latest auto created ID will be loaded.
        /// by default, when saving a new domain model, the latest auto created ID will be loaded.41
 /// </summary>
        /// </summary>42
 protected virtual void LoadCreatedID(DbTransaction tran)
        protected virtual void LoadCreatedID(DbTransaction tran)43

 
         {
{44
 KeyValueCollection keyValues = entityValue.GetKeyValues();
            KeyValueCollection keyValues = entityValue.GetKeyValues();45

46
 keyValues[0] = Gateway.Db.ExecuteScalar(tran, CommandType.Text, string.Format("select max([{0}]) from [{1}]", keyValues.GetKeys()[0], typeof(IEntityType).Name));
            keyValues[0] = Gateway.Db.ExecuteScalar(tran, CommandType.Text, string.Format("select max([{0}]) from [{1}]", keyValues.GetKeys()[0], typeof(IEntityType).Name));47
 }
        }48

49
 protected virtual void DoUpdate(DbTransaction tran)
        protected virtual void DoUpdate(DbTransaction tran)50

 
         {
{51
 string[] exceptColumns = Gateway.CompareEntities<IEntityType>(entityValue, entityValue2);
            string[] exceptColumns = Gateway.CompareEntities<IEntityType>(entityValue, entityValue2);52
 if (exceptColumns.Length == NBear.Common.Entity<IEntityType>.GetKeys().Length)
            if (exceptColumns.Length == NBear.Common.Entity<IEntityType>.GetKeys().Length)53

 
             {
{54
 //no columns are modified, so no need to update
                //no columns are modified, so no need to update55
 return;
                return;56
 }
            }57
 KeyValueCollection keyValues = entityValue.GetKeyValues();
            KeyValueCollection keyValues = entityValue.GetKeyValues();58
 if (tran == null)
            if (tran == null)59

 
             {
{60
 Gateway.Update<IEntityType>(keyValues.GetKeys(exceptColumns), keyValues.GetValues(exceptColumns), ID);
                Gateway.Update<IEntityType>(keyValues.GetKeys(exceptColumns), keyValues.GetValues(exceptColumns), ID);61
 }
            }62
 else
            else63

 
             {
{64
 Gateway.Update<IEntityType>(keyValues.GetKeys(exceptColumns), keyValues.GetValues(exceptColumns), ID, tran);
                Gateway.Update<IEntityType>(keyValues.GetKeys(exceptColumns), keyValues.GetValues(exceptColumns), ID, tran);65
 }
            }66
 }
        }67

68
 protected virtual void DoCreate(DbTransaction tran)
        protected virtual void DoCreate(DbTransaction tran)69

 
         {
{70
 string exceptKeyColumn = Entity<IEntityType>.GetKeys()[0];
            string exceptKeyColumn = Entity<IEntityType>.GetKeys()[0];71
 if (tran == null)
            if (tran == null)72

 
             {
{73
 DbTransaction t = Gateway.BeginTransaction();
                DbTransaction t = Gateway.BeginTransaction();74

75
 try
                try76

 
                 {
{77
 Gateway.Insert<IEntityType>(entityValue, t, exceptKeyColumn);
                    Gateway.Insert<IEntityType>(entityValue, t, exceptKeyColumn);78

79
 LoadCreatedID(t);
                    LoadCreatedID(t);80

81
 t.Commit();
                    t.Commit();82
 }
                }83
 catch
                catch84

 
                 {
{85
 t.Rollback();
                    t.Rollback();86
 }
                }87
 finally
                finally88

 
                 {
{89
 Gateway.CloseTransaction(t);
                    Gateway.CloseTransaction(t);90
 }
                }91
 }
            }92
 else
            else93

 
             {
{94
 Gateway.Insert<IEntityType>(entityValue, tran, exceptKeyColumn);
                Gateway.Insert<IEntityType>(entityValue, tran, exceptKeyColumn);95
 LoadCreatedID(tran);
                LoadCreatedID(tran);96
 }
            }97
 }
        }98

99
 #endregion
        #endregion100

101

 Properties#region Properties
        Properties#region Properties102

103
 public IEntityType EntityValue
        public IEntityType EntityValue104

 
         {
{105
 get
            get106

 
             {
{107
 return entityValue;
                return entityValue;108
 }
            } 109
 }
        }110

111
 public IEntityViewType EntityViewValue
        public IEntityViewType EntityViewValue112

 
         {
{113
 get
            get114

 
             {
{115
 return entityViewValue;
                return entityViewValue;116
 }
            }117
 }
        }118

119
 public virtual object ID
        public virtual object ID120

 
         {
{121
 get
            get122

 
             {
{123
 return entityValue.GetKeyValues()[0];
                return entityValue.GetKeyValues()[0];124
 }
            }125
 }
        }126

127
 #endregion
        #endregion128

129

 Basic CRUD#region Basic CRUD
        Basic CRUD#region Basic CRUD130

131
 public virtual void LoadFromEntity(IEntityViewType entityView)
        public virtual void LoadFromEntity(IEntityViewType entityView)132

 
         {
{133
 if (entityView == null)
            if (entityView == null)134

 
             {
{135
 return;
                return;136
 }
            }137
 entityValue = Gateway.ConvertEntity<IEntityViewType, IEntityType>(entityView);
            entityValue = Gateway.ConvertEntity<IEntityViewType, IEntityType>(entityView);138
 entityValue2 = Gateway.ConvertEntity<IEntityViewType, IEntityType>(entityView);
            entityValue2 = Gateway.ConvertEntity<IEntityViewType, IEntityType>(entityView);139
 }
        }140

141
 public void Save()
        public void Save()142

 
         {
{143
 Save(null);
            Save(null);144
 }
        }145

146
 public virtual void Save(DbTransaction tran)
        public virtual void Save(DbTransaction tran)147

 
         {
{148
 if (ID == null || Convert.ToInt32(ID) ==  0)
            if (ID == null || Convert.ToInt32(ID) ==  0)149

 
             {
{150
 DoCreate(tran);
                DoCreate(tran);151
 }
            }152
 else
            else153

 
             {
{154
 DoUpdate(tran);
                DoUpdate(tran);155
 }
            }156

157
 LoadFromEntity(Gateway.Get<IEntityViewType>(ID));
            LoadFromEntity(Gateway.Get<IEntityViewType>(ID));158
 }
        }159

160
 public static DomainType Find(object id)
        public static DomainType Find(object id)161

 
         {
{162
 DomainType obj = new DomainType();
            DomainType obj = new DomainType();163
 obj.LoadFromEntity(Gateway.Get<IEntityViewType>(id));
            obj.LoadFromEntity(Gateway.Get<IEntityViewType>(id));164
 return obj;
            return obj;165
 }
        }166

167
 public static DomainType[] FindAll(string orderBy)
        public static DomainType[] FindAll(string orderBy)168

 
         {
{169
 return EntityViewArrayToDomainArray(Gateway.SelectAll<IEntityViewType>(orderBy));
            return EntityViewArrayToDomainArray(Gateway.SelectAll<IEntityViewType>(orderBy));170
 }
        }171

172
 public static DomainType[] EntityViewArrayToDomainArray(IEntityViewType[] entityViews)
        public static DomainType[] EntityViewArrayToDomainArray(IEntityViewType[] entityViews)173

 
         {
{174
 DomainType[] objs = new DomainType[entityViews.Length];
            DomainType[] objs = new DomainType[entityViews.Length];175
 for (int i = 0; i < objs.Length; i++)
            for (int i = 0; i < objs.Length; i++)176

 
             {
{177
 DomainType obj = new DomainType();
                DomainType obj = new DomainType();178
 obj.LoadFromEntity(entityViews[i]);
                obj.LoadFromEntity(entityViews[i]);179
 objs[i] = obj;
                objs[i] = obj;180
 }
            }181
 return objs;
            return objs;182
 }
        }183

184
 public static void Delete(object id)
        public static void Delete(object id)185

 
         {
{186
 Gateway.Delete<IEntityType>(id);
            Gateway.Delete<IEntityType>(id);187
 }
        }188

189
 #endregion
        #endregion190

191

 Gateway#region Gateway
        Gateway#region Gateway192

193
 private static NBear.Data.Facade.Gateway _Gateway = null;
        private static NBear.Data.Facade.Gateway _Gateway = null;194

195
 public static NBear.Data.Facade.Gateway Gateway
        public static NBear.Data.Facade.Gateway Gateway196

 
         {
{197
 get
            get198

 
             {
{199
 return (_Gateway == null ? GatewayManager.DefaultGateway : _Gateway);
                return (_Gateway == null ? GatewayManager.DefaultGateway : _Gateway);200
 }
            }201
 set
            set202

 
             {
{203
 _Gateway = value;
                _Gateway = value;204
 }
            }205
 }
        }206

207
 #endregion
        #endregion208
 }
    }209

210
 public abstract class DomainModel<IEntityType, DomainType> : DomainModel<IEntityType, IEntityType, DomainType>
    public abstract class DomainModel<IEntityType, DomainType> : DomainModel<IEntityType, IEntityType, DomainType>211
 where IEntityType : IEntity
        where IEntityType : IEntity212
 where DomainType : IDomainModel<IEntityType, IEntityType>, new()
        where DomainType : IDomainModel<IEntityType, IEntityType>, new()213

 
     {
{214
 }
    }215

216
 public abstract class GuidKeyDomainModel<IEntityType, IEntityViewType, DomainType> : DomainModel<IEntityType, IEntityViewType, DomainType>
    public abstract class GuidKeyDomainModel<IEntityType, IEntityViewType, DomainType> : DomainModel<IEntityType, IEntityViewType, DomainType>217
 where IEntityType : IEntity
        where IEntityType : IEntity218
 where IEntityViewType : IEntity
        where IEntityViewType : IEntity219
 where DomainType : IDomainModel<IEntityType, IEntityViewType>, new()
        where DomainType : IDomainModel<IEntityType, IEntityViewType>, new()220

 
     {
{221
 protected override void DoCreate(DbTransaction tran)
        protected override void DoCreate(DbTransaction tran)222

 
         {
{223
 //create guid
            //create guid224
 entityValue.GetKeyValues()[0] = Guid.NewGuid().ToString();
            entityValue.GetKeyValues()[0] = Guid.NewGuid().ToString();225

226
 if (tran == null)
            if (tran == null)227

 
             {
{228
 Gateway.Insert<IEntityType>(entityValue);
                Gateway.Insert<IEntityType>(entityValue);229
 }
            }230
 else
            else231

 
             {
{232
 Gateway.Insert<IEntityType>(entityValue, tran);
                Gateway.Insert<IEntityType>(entityValue, tran);233
 }
            }234
 }
        }235
 }
    }236

237
 public abstract class GuidKeyDomainModel<IEntityType, DomainType> : GuidKeyDomainModel<IEntityType, IEntityType, DomainType>
    public abstract class GuidKeyDomainModel<IEntityType, DomainType> : GuidKeyDomainModel<IEntityType, IEntityType, DomainType>238
 where IEntityType : IEntity
        where IEntityType : IEntity239
 where DomainType : IDomainModel<IEntityType, IEntityType>, new()
        where DomainType : IDomainModel<IEntityType, IEntityType>, new()240

 
     {
{241
 }
    }242
 }
}示例
首先,还是需要用NBear.Tools.EntityGen生成实体,这里的数据库还是采用的之前的示例Sample2中的数据库TestRelation.mdb。

 Entities.cs
Entities.cs1
 using System;
using System;2
 using System.Collections.Generic;
using System.Collections.Generic;3
 using System.Text;
using System.Text;4
 using NBear.Common;
using NBear.Common;5

6
 namespace Sample6.Entities
namespace Sample6.Entities7


 {
{8
 public interface Group : IEntity
    public interface Group : IEntity9

 
     {
{10

 int ID
        int ID  { get; set; }
{ get; set; }11

 string Title
        string Title  { get; set; }
{ get; set; }12

 string Description
        string Description  { get; set; }
{ get; set; }13

 System.DateTime CreateTime
        System.DateTime CreateTime  { get; set; }
{ get; set; }14

 int ParentID
        int ParentID  { get; set; }
{ get; set; }15
 }
    }16

17
 public interface Message : IEntity
    public interface Message : IEntity18

 
     {
{19

 int ID
        int ID  { get; set; }
{ get; set; }20

 int FromUserID
        int FromUserID  { get; set; }
{ get; set; }21

 int ToUserID
        int ToUserID  { get; set; }
{ get; set; }22

 string Title
        string Title  { get; set; }
{ get; set; }23

 string Content
        string Content  { get; set; }
{ get; set; }24

 System.DateTime SendTime
        System.DateTime SendTime  { get; set; }
{ get; set; }25
 }
    }26

27
 public interface User : IEntity
    public interface User : IEntity28

 
     {
{29

 int ID
        int ID  { get; set; }
{ get; set; }30

 string Name
        string Name  { get; set; }
{ get; set; }31

 bool Gender
        bool Gender  { get; set; }
{ get; set; }32

 double Salary
        double Salary  { get; set; }
{ get; set; }33
 }
    }34

35
 public interface UserGroup : IEntity
    public interface UserGroup : IEntity36

 
     {
{37

 int UserID
        int UserID  { get; set; }
{ get; set; }38

 int GroupID
        int GroupID  { get; set; }
{ get; set; }39
 }
    }40

41
 public interface vGroup : IEntity
    public interface vGroup : IEntity42

 
     {
{43

 int ID
        int ID  { get; set; }
{ get; set; }44

 string Title
        string Title  { get; set; }
{ get; set; }45

 string Description
        string Description  { get; set; }
{ get; set; }46

 System.DateTime CreateTime
        System.DateTime CreateTime  { get; set; }
{ get; set; }47

 int ParentID
        int ParentID  { get; set; }
{ get; set; }48

 int UserID
        int UserID  { get; set; }
{ get; set; }49
 }
    }50

51
 public interface vMessage : IEntity
    public interface vMessage : IEntity52

 
     {
{53

 int ID
        int ID  { get; set; }
{ get; set; }54

 int FromUserID
        int FromUserID  { get; set; }
{ get; set; }55

 string FromUserName
        string FromUserName  { get; set; }
{ get; set; }56

 int ToUserID
        int ToUserID  { get; set; }
{ get; set; }57

 string ToUserName
        string ToUserName  { get; set; }
{ get; set; }58

 string Title
        string Title  { get; set; }
{ get; set; }59

 string Content
        string Content  { get; set; }
{ get; set; }60

 System.DateTime SendTime
        System.DateTime SendTime  { get; set; }
{ get; set; }61
 }
    }62

63
 public interface vUser : IEntity
    public interface vUser : IEntity64

 
     {
{65

 int ID
        int ID  { get; set; }
{ get; set; }66

 string Name
        string Name  { get; set; }
{ get; set; }67

 bool Gender
        bool Gender  { get; set; }
{ get; set; }68

 double Salary
        double Salary  { get; set; }
{ get; set; }69

 int GroupID
        int GroupID  { get; set; }
{ get; set; }70
 }
    }71
 }
}接着就能定义领域模型了,只需简单的继承DomainModel,你的类就拥有了基本的CURD接口,如下面的Message类,你也可以扩展你的类,为你的领域类扩充复杂的领域功能,使用OneToMany类,操作与当前类关联的其他实体也非常便利,如这里的Group和User类。

 Domains.cs
Domains.cs1
 using System;
using System;2
 using System.Collections.Generic;
using System.Collections.Generic;3
 using System.Text;
using System.Text;4
 using NBear.Common;
using NBear.Common;5
 using NBear.Data.Facade;
using NBear.Data.Facade;6
 using NBear.Domain;
using NBear.Domain;7

8
 namespace Sample6.Domains
namespace Sample6.Domains9


 {
{10
 public class Group : DomainModel<Entities.Group, Entities.vGroup, Group>
    public class Group : DomainModel<Entities.Group, Entities.vGroup, Group>11

 
     {
{12
 private OneToMany<Entities.Group, Entities.vGroup, Entities.UserGroup, Entities.vUser> groupToUsers;
        private OneToMany<Entities.Group, Entities.vGroup, Entities.UserGroup, Entities.vUser> groupToUsers;13

14
 public override void LoadFromEntity(Sample6.Entities.vGroup entityView)
        public override void LoadFromEntity(Sample6.Entities.vGroup entityView)15

 
         {
{16
 base.LoadFromEntity(entityView);
            base.LoadFromEntity(entityView);17

18
 groupToUsers = new OneToMany<Entities.Group,Entities.vGroup,Entities.UserGroup,Entities.vUser>(Gateway.Db, "GroupID", entityValue, entityView);
            groupToUsers = new OneToMany<Entities.Group,Entities.vGroup,Entities.UserGroup,Entities.vUser>(Gateway.Db, "GroupID", entityValue, entityView);19
 }
        }20

21
 public User[] FindUsersInGroup(string orderBy)
        public User[] FindUsersInGroup(string orderBy)22

 
         {
{23
 return (groupToUsers == null ? null : User.EntityViewArrayToDomainArray(groupToUsers.SelectMany(null, orderBy)));
            return (groupToUsers == null ? null : User.EntityViewArrayToDomainArray(groupToUsers.SelectMany(null, orderBy)));24
 }
        }25

26
 public void AddUserToGroup(object userID)
        public void AddUserToGroup(object userID)27

 
         {
{28
 if (groupToUsers == null)
            if (groupToUsers == null)29

 
             {
{30
 return;
                return;31
 }
            }32

33
 Entities.UserGroup userGroup = groupToUsers.CreateNewRelationEntity();
            Entities.UserGroup userGroup = groupToUsers.CreateNewRelationEntity();34
 userGroup.UserID = (int)userID;
            userGroup.UserID = (int)userID;35
 groupToUsers.InsertMany(userGroup);
            groupToUsers.InsertMany(userGroup);36
 }
        }37

38
 public void DeleteUserFromGroup(object userID)
        public void DeleteUserFromGroup(object userID)39

 
         {
{40
 if (groupToUsers == null)
            if (groupToUsers == null)41

 
             {
{42
 return;
                return;43
 }
            }44

45
 groupToUsers.DeleteMany("[UserID] = @UserID", userID);
            groupToUsers.DeleteMany("[UserID] = @UserID", userID);46
 }
        }47
 }
    }48

49
 public class Message : DomainModel<Entities.Message, Entities.vMessage, Message>
    public class Message : DomainModel<Entities.Message, Entities.vMessage, Message>50

 
     {
{51
 }
    }52

53
 public class User : DomainModel<Entities.User, Entities.vUser, User>
    public class User : DomainModel<Entities.User, Entities.vUser, User>54

 
     {
{55
 private OneToMany<Entities.User, Entities.vUser, Entities.Message, Entities.vMessage> fromUserToMessages;
        private OneToMany<Entities.User, Entities.vUser, Entities.Message, Entities.vMessage> fromUserToMessages;56
 private OneToMany<Entities.User, Entities.vUser, Entities.Message, Entities.vMessage> toUserToMessages;
        private OneToMany<Entities.User, Entities.vUser, Entities.Message, Entities.vMessage> toUserToMessages;57

58
 public override void LoadFromEntity(Sample6.Entities.vUser entityView)
        public override void LoadFromEntity(Sample6.Entities.vUser entityView)59

 
         {
{60
 base.LoadFromEntity(entityView);
            base.LoadFromEntity(entityView);61

62
 fromUserToMessages = new OneToMany<Entities.User, Entities.vUser, Entities.Message, Entities.vMessage>(Gateway.Db, "fromUserID", entityValue, entityView);
            fromUserToMessages = new OneToMany<Entities.User, Entities.vUser, Entities.Message, Entities.vMessage>(Gateway.Db, "fromUserID", entityValue, entityView);63
 toUserToMessages = new OneToMany<Entities.User, Entities.vUser, Entities.Message, Entities.vMessage>(Gateway.Db, "toUserID", entityValue, entityView);
            toUserToMessages = new OneToMany<Entities.User, Entities.vUser, Entities.Message, Entities.vMessage>(Gateway.Db, "toUserID", entityValue, entityView);64
 }
        }65

66
 public Message[] FindSentMessages(string orderBy)
        public Message[] FindSentMessages(string orderBy)67

 
         {
{68
 if (fromUserToMessages == null)
            if (fromUserToMessages == null)69

 
             {
{70
 return null;
                return null;71
 }
            }72

73
 return Message.EntityViewArrayToDomainArray(fromUserToMessages.SelectMany(null, orderBy));
            return Message.EntityViewArrayToDomainArray(fromUserToMessages.SelectMany(null, orderBy));74
 }
        }75

76
 public Message[] FindReceivedMessages(string orderBy)
        public Message[] FindReceivedMessages(string orderBy)77

 
         {
{78
 if (toUserToMessages == null)
            if (toUserToMessages == null)79

 
             {
{80
 return null;
                return null;81
 }
            }82

83
 return Message.EntityViewArrayToDomainArray(toUserToMessages.SelectMany(null, orderBy));
            return Message.EntityViewArrayToDomainArray(toUserToMessages.SelectMany(null, orderBy));84
 }
        }85
 }
    }86
 }
}ok,领域模型定义完了,下面就可以方便的使用以上类了:

 Usage.cs
Usage.cs1
 using System;
using System;2
 using System.Collections.Generic;
using System.Collections.Generic;3
 using System.Data.Common;
using System.Data.Common;4
 using System.Text;
using System.Text;5
 using NBear.Domain;
using NBear.Domain;6
 using Sample6.Domains;
using Sample6.Domains;7
 using NBear.Data.Facade;
using NBear.Data.Facade;8

9
 namespace Sample6
namespace Sample610


 {
{11
 public class Usage
    public class Usage12

 
     {
{13
 public static void Main()
        public static void Main()14

 
         {
{15
 //first you should set GatewayManager.DefaultGateway for all Domain Models before using them
            //first you should set GatewayManager.DefaultGateway for all Domain Models before using them16
 GatewayManager.DefaultGateway = new Gateway(DatabaseType.MsAccess, @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\Teddy\NBear\dist\Sample6\App_Data\TestRelation.mdb");
            GatewayManager.DefaultGateway = new Gateway(DatabaseType.MsAccess, @"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\Teddy\NBear\dist\Sample6\App_Data\TestRelation.mdb");17

18
 //if neccessary, you can set Specific Domain Models using specific Gateway instead of DefaultGateway
            //if neccessary, you can set Specific Domain Models using specific Gateway instead of DefaultGateway19
 //Group.Gateway =
            //Group.Gateway =  ;
;20
 //Message.Gateway =
            //Message.Gateway =  ;
;21
 //User.Gateway =
            //User.Gateway =  ;
;22

23
 //use Domain Models
            //use Domain Models24

25
 //find group & users in group
            //find group & users in group26
 Group group = Group.Find(1);
            Group group = Group.Find(1);27
 User[] usersInGroup = group.FindUsersInGroup("ID desc");
            User[] usersInGroup = group.FindUsersInGroup("ID desc");28

29
 //modify and save group
            //modify and save group30
 //only modified properties will be in the update SQL which will be created behind domain model code
            //only modified properties will be in the update SQL which will be created behind domain model code31
 group.EntityValue.Description = "modified description";
            group.EntityValue.Description = "modified description";32
 group.Save();
            group.Save();33

34
 //find user & delete from group
            //find user & delete from group35
 User user = usersInGroup[0];
            User user = usersInGroup[0];36
 Message[] sentMessages = user.FindSentMessages("SendTime desc");
            Message[] sentMessages = user.FindSentMessages("SendTime desc");37
 group.DeleteUserFromGroup(user.ID);
            group.DeleteUserFromGroup(user.ID);38

39
 //create new user & add to group
            //create new user & add to group40
 User newUser = new User();
            User newUser = new User();41
 newUser.EntityValue.Name = "new user";
            newUser.EntityValue.Name = "new user";42
 newUser.EntityValue.Salary = 1000;
            newUser.EntityValue.Salary = 1000;43
 newUser.EntityValue.Gender = false;
            newUser.EntityValue.Gender = false;44
 newUser.Save();
            newUser.Save();45
 group.AddUserToGroup(newUser.ID);
            group.AddUserToGroup(newUser.ID);46

47
 //modify user salary, save & send message in a transaction
            //modify user salary, save & send message in a transaction48
 DbTransaction tran = User.Gateway.BeginTransaction();
            DbTransaction tran = User.Gateway.BeginTransaction();49
 try
            try50

 
             {
{51
 user.EntityValue.Salary = 99999;
                user.EntityValue.Salary = 99999;52
 user.Save(tran);
                user.Save(tran);53

54
 Message msg = new Message();
                Message msg = new Message();55
 msg.EntityValue.Title = "new msg";
                msg.EntityValue.Title = "new msg";56
 msg.EntityValue.Content = "salary changed";
                msg.EntityValue.Content = "salary changed";57
 msg.EntityValue.FromUserID = user.EntityValue.ID;
                msg.EntityValue.FromUserID = user.EntityValue.ID;58
 msg.EntityValue.ToUserID = 3;
                msg.EntityValue.ToUserID = 3;59
 msg.EntityValue.SendTime = DateTime.Now;
                msg.EntityValue.SendTime = DateTime.Now;60
 msg.Save(tran);
                msg.Save(tran);61

62
 tran.Commit();
                tran.Commit();63
 }
            }64
 catch
            catch65

 
             {
{66
 tran.Rollback();
                tran.Rollback();67
 throw;
                throw;68
 }
            }69
 finally
            finally70

 
             {
{71
 User.Gateway.CloseTransaction(tran);
                User.Gateway.CloseTransaction(tran);72
 }
            }73

74
 //if you want to access more user's value than its basic value, you can access user.EntityViewType, which is its view entity - vUser
            //if you want to access more user's value than its basic value, you can access user.EntityViewType, which is its view entity - vUser75
 int groupIDOfUser = user.EntityViewValue.GroupID;
            int groupIDOfUser = user.EntityViewValue.GroupID;76
 }
        }77
 }
    }78
 }
} 
                     
                    
                 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号