技术开发 频道

基于NBear的Domain层设计

IT168技术文档】

    NBear是Teddy开发的快速开发框架,在之前的5个示例中,主要演示了主要的框架功能和业务领域模型不太复杂情形下忽略领域层的应用范例。但是,当业务模型相对复杂,单纯基于简单实体的强类型数据访问接口,可能就会使得太多的业务逻辑被分散到service或facade层,此时,我们就最好加一层独立的业务领域模型层来封装实体和强类型接口的使用。本文为您演示基于NBear v1.6.0中新增的NBear.Domain的领域模型设计示例。

    NBear.Domain

    NBear.Domain主要为您提供了基类DomainModel和GuidKeyDomainModel,前者用于采用自增长ID主键的实体,后者用于采用Guid主键的实体。只需将他们作为你的领域类的基类,它就能提供最基本的领域类需要的CRUD等功能(包括Save, Delete, Find, FindAll等),您可以方便的以此为基础进行扩展。

    DomainModel.cs

...

    示例

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

    Entities.cs

...


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

Domains.cs
1using System;
2using System.Collections.Generic;
3using System.Text;
4using NBear.Common;
5using NBear.Data.Facade;
6using NBear.Domain;
7
8namespace Sample6.Domains
9{
10 public class Group : DomainModel<Entities.Group, Entities.vGroup, Group>
11 {
12 private OneToMany<Entities.Group, Entities.vGroup, Entities.UserGroup, Entities.vUser> groupToUsers;
13
14 public override void LoadFromEntity(Sample6.Entities.vGroup entityView)
15 {
16 base.LoadFromEntity(entityView);
17
18 groupToUsers = new OneToMany<Entities.Group,Entities.vGroup,Entities.UserGroup,Entities.vUser>(Gateway.Db, "GroupID", entityValue, entityView);
19 }
20
21 public User[] FindUsersInGroup(string orderBy)
22 {
23 return (groupToUsers == null ? null : User.EntityViewArrayToDomainArray(groupToUsers.SelectMany(null, orderBy)));
24 }
25
26 public void AddUserToGroup(object userID)
27 {
28 if (groupToUsers == null)
29 {
30 return;
31 }
32
33 Entities.UserGroup userGroup = groupToUsers.CreateNewRelationEntity();
34 userGroup.UserID = (int)userID;
35 groupToUsers.InsertMany(userGroup);
36 }
37
38 public void DeleteUserFromGroup(object userID)
39 {
40 if (groupToUsers == null)
41 {
42 return;
43 }
44
45 groupToUsers.DeleteMany("[UserID] = @UserID", userID);
46 }
47 }
48
49 public class Message : DomainModel<Entities.Message, Entities.vMessage, Message>
50 {
51 }
52
53 public class User : DomainModel<Entities.User, Entities.vUser, User>
54 {
55 private OneToMany<Entities.User, Entities.vUser, Entities.Message, Entities.vMessage> fromUserToMessages;
56 private OneToMany<Entities.User, Entities.vUser, Entities.Message, Entities.vMessage> toUserToMessages;
57
58 public override void LoadFromEntity(Sample6.Entities.vUser entityView)
59 {
60 base.LoadFromEntity(entityView);
61
62 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);
64 }
65
66 public Message[] FindSentMessages(string orderBy)
67 {
68 if (fromUserToMessages == null)
69 {
70 return null;
71 }
72
73 return Message.EntityViewArrayToDomainArray(fromUserToMessages.SelectMany(null, orderBy));
74 }
75
76 public Message[] FindReceivedMessages(string orderBy)
77 {
78 if (toUserToMessages == null)
79 {
80 return null;
81 }
82
83 return Message.EntityViewArrayToDomainArray(toUserToMessages.SelectMany(null, orderBy));
84 }
85 }
86}
ok,领域模型定义完了,下面就可以方便的使用以上类了:
1using System;
2using System.Collections.Generic;
3using System.Data.Common;
4using System.Text;
5using NBear.Domain;
6using Sample6.Domains;
7using NBear.Data.Facade;
8
9namespace Sample6
10{
11 public class Usage
12 {
13 public static void Main()
14 {
15 //first you should set GatewayManager.DefaultGateway for all Domain Models before using them
16 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
19 //Group.Gateway = ;
20 //Message.Gateway = ;
21 //User.Gateway = ;
22
23 //use Domain Models
24
25 //find group & users in group
26 Group group = Group.Find(1);
27 User[] usersInGroup = group.FindUsersInGroup("ID desc");
28
29 //modify and save group
30 //only modified properties will be in the update SQL which will be created behind domain model code
31 group.EntityValue.Description = "modified description";
32 group.Save();
33
34 //find user & delete from group
35 User user = usersInGroup[0];
36 Message[] sentMessages = user.FindSentMessages("SendTime desc");
37 group.DeleteUserFromGroup(user.ID);
38
39 //create new user & add to group
40 User newUser = new User();
41 newUser.EntityValue.Name = "new user";
42 newUser.EntityValue.Salary = 1000;
43 newUser.EntityValue.Gender = false;
44 newUser.Save();
45 group.AddUserToGroup(newUser.ID);
46
47 //modify user salary, save & send message in a transaction
48 DbTransaction tran = User.Gateway.BeginTransaction();
49 try
50 {
51 user.EntityValue.Salary = 99999;
52 user.Save(tran);
53
54 Message msg = new Message();
55 msg.EntityValue.Title = "new msg";
56 msg.EntityValue.Content = "salary changed";
57 msg.EntityValue.FromUserID = user.EntityValue.ID;
58 msg.EntityValue.ToUserID = 3;
59 msg.EntityValue.SendTime = DateTime.Now;
60 msg.Save(tran);
61
62 tran.Commit();
63 }
64 catch
65 {
66 tran.Rollback();
67 throw;
68 }
69 finally
70 {
71 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
75 int groupIDOfUser = user.EntityViewValue.GroupID;
76 }
77 }
78}

0
相关文章