入行IT十年了,这是本人第一次网上’献丑‘。迫于工作压力,花了大半年时间写了这个生成器以辅助开发。如有价值请多多给予建议,谢谢
好了,废话少说,开动!
QA.
1.为什么要用代码生成器?
当然是为了快速开发,且保证代码的一致性,便于维护。
2.代码生成器没缺点吗?
当然有缺点了,就是它不能代替人,如果鼠标一按就生成整个系统!那我们程序员是在一边喝咖啡还是背包走人?幸好代码生成器不会那么智能..
3.代码生成器生成的代码是一锤子买卖?
可以不是一锤子买卖,反复修改生成器的元数据,可以持久享受代码生成器的好处。
4.文中这个代码生成器有什么特点?
1)理论上如果熟悉这个代码生成器的原理,任何人可以定制出自己希望的常用模式代码(为什么叫模式,指个人或团队实现功能的代码编写模式/习惯性代码等等),
目前生成的代码是针对的.NET平台下的ASP.NET MVC3+ EF+WCF+Web代码。
2)非侵入性,代码可以完全定制以适应当前架构需要,而不是架构适应生成器。
3)难度系数比较高,需要掌握antlr 文法分析+基础的java控制台编程知识+winform.net.但回报可能会远远大于付出。
5.这个工具,有人在实际中用吗?
作者和所在开发团队在使用。效果非常好,大大的减少了开发成本和测试维护成本。
6.开源吗?
计划中,由于个人工作太忙,等有空闲时间进行重构整理,以免仓促而误人子弟。
0.概要介绍
设计阶段:在文本编辑器里面编辑xml模型和数据模型元数据,工具会自动校验和分析,并生成相应代码和sql。
持久阶段:1. 设计阶段生成表后,工具从数据库获取最新表/视图,可以生成相应的增删改查功能也页面等等。
2. 支持自定义参数化查询(语法采用标准sql,支持单表/多表/高级查询),自数据层到服务层,web层的生成。
3. 反向工程:支持数据库表到设计阶段的数据模型元数据的同步,使设计永不过时并复用。
4. 支持生成数据词典。
生成器窗口:
红色区域可以望文生义,不用赘述。
双击错误列表可以打开相应文件并使光标定位到错误点。
1.设计阶段
包括对xml和数据库设计的设计。
1.1 Xml的Dom代码生成
1.1.1 xml语法规则如下:
1.1.2 生成dom操作代码:
1.1.3 生成的代码
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Xml;
6 using CodeHelper.Xml.Extension;
7 using CodeHelper.Xml;
8
9 namespace CodeHelper.Workflow.Designer.Core.Config
10 {
11
12 public class WorkflowDefine
13 : DataNode
14 {
15 public WorkflowDefine
16 ()
17 :
base()
18 {
19 }
20
21 public WorkflowDefine
22 (XmlNode dom)
23 :
base(dom)
24 {
25 }
26
27 public WorkflowDefine
28 (Document document)
29 :
base(document)
30 {
31 }
32
33 public override string XML_TAG_NAME
34 {
35 get
36 {
37 return "WorkflowDefine";
38 }
39 set
40 {
41 throw new Exception(
"cannot set");
42 }
43 }
44
45 public event ProperyChanged<
string>
OnId_ProperyChanged;
46 public override string Id
47 {
48 get
49 {
50 if (
this.Dom.Attributes[
"Id"] ==
null)
51 return default(
string);
52 return this.Dom.Attributes[
"Id"].Value.ToT<
string>
();
53 }
54 set
55 {
56 var attr =
this.Dom.Attributes.OfType<XmlAttribute>
()
57 .FirstOrDefault(x => x.Name ==
"Id");
58 var oldValue =
default(
string);
59 var newValue =
value;
60 if (attr ==
null)
61 {
62 attr =
this.Dom.Attributes.Append(
this.Dom.OwnerDocument.CreateAttribute(
"Id"));
63 }
64 else
65 {
66 oldValue =
this.Dom.Attributes[
"Id"].Value.ToT<
string>
();
67 }
68
69 if (value !=
null)
70 attr.Value =
value.ToString();
71
72 if (OnId_ProperyChanged !=
null && oldValue !=
newValue)
73 {
74 OnId_ProperyChanged(oldValue, newValue);
75 }
76 this.FireAnyProperyChanged(
"Id", oldValue, newValue);
77 }
78 }
79 public event ProperyChanged<
string>
OnName_ProperyChanged;
80 public string Name
81 {
82 get
83 {
84 if (
this.Dom.Attributes[
"Name"] ==
null)
85 return default(
string);
86 return this.Dom.Attributes[
"Name"].Value.ToT<
string>
();
87 }
88 set
89 {
90 var attr =
this.Dom.Attributes.OfType<XmlAttribute>
()
91 .FirstOrDefault(x => x.Name ==
"Name");
92 var oldValue =
default(
string);
93 var newValue =
value;
94 if (attr ==
null)
95 {
96 attr =
this.Dom.Attributes.Append(
this.Dom.OwnerDocument.CreateAttribute(
"Name"));
97 }
98 else
99 {
100 oldValue =
this.Dom.Attributes[
"Name"].Value.ToT<
string>
();
101 }
102
103 if (value !=
null)
104 attr.Value =
value.ToString();
105
106 if (OnName_ProperyChanged !=
null && oldValue !=
newValue)
107 {
108 OnName_ProperyChanged(oldValue, newValue);
109 }
110 this.FireAnyProperyChanged(
"Name", oldValue, newValue);
111 }
112 }
113 public event ProperyChanged<
string>
OnDescription_ProperyChanged;
114 public string Description
115 {
116 get
117 {
118 if (
this.Dom.Attributes[
"Description"] ==
null)
119 return default(
string);
120 return this.Dom.Attributes[
"Description"].Value.ToT<
string>
();
121 }
122 set
123 {
124 var attr =
this.Dom.Attributes.OfType<XmlAttribute>
()
125 .FirstOrDefault(x => x.Name ==
"Description");
126 var oldValue =
default(
string);
127 var newValue =
value;
128 if (attr ==
null)
129 {
130 attr =
this.Dom.Attributes.Append(
this.Dom.OwnerDocument.CreateAttribute(
"Description"));
131 }
132 else
133 {
134 oldValue =
this.Dom.Attributes[
"Description"].Value.ToT<
string>
();
135 }
136
137 if (value !=
null)
138 attr.Value =
value.ToString();
139
140 if (OnDescription_ProperyChanged !=
null && oldValue !=
newValue)
141 {
142 OnDescription_ProperyChanged(oldValue, newValue);
143 }
144 this.FireAnyProperyChanged(
"Description", oldValue, newValue);
145 }
146 }
147 public event ProperyChanged<
string>
OnVariable_ProperyChanged;
148 public string Variable
149 {
150 get
151 {
152 if (
this.Dom.Attributes[
"Variable"] ==
null)
153 return default(
string);
154 return this.Dom.Attributes[
"Variable"].Value.ToT<
string>
();
155 }
156 set
157 {
158 var attr =
this.Dom.Attributes.OfType<XmlAttribute>
()
159 .FirstOrDefault(x => x.Name ==
"Variable");
160 var oldValue =
default(
string);
161 var newValue =
value;
162 if (attr ==
null)
163 {
164 attr =
this.Dom.Attributes.Append(
this.Dom.OwnerDocument.CreateAttribute(
"Variable"));
165 }
166 else
167 {
168 oldValue =
this.Dom.Attributes[
"Variable"].Value.ToT<
string>
();
169 }
170
171 if (value !=
null)
172 attr.Value =
value.ToString();
173
174 if (OnVariable_ProperyChanged !=
null && oldValue !=
newValue)
175 {
176 OnVariable_ProperyChanged(oldValue, newValue);
177 }
178 this.FireAnyProperyChanged(
"Variable", oldValue, newValue);
179 }
180 }
181
182 public FieldDef CreateFieldDef()
183 {
184 return this.Dom.CreateNode<FieldDef>
();
185 }
186
187 public NodeList<FieldDef>
Fields
188 {
189 get
190 {
191 NodeList<FieldDef> fields =
null;
192 XmlNode fields_node =
null;
193
194 foreach (XmlNode node
in this.Dom.ChildNodes)
195 {
196 if (node.Name ==
"Fields")
197 {
198 fields_node =
node;
199 fields =
new NodeList<FieldDef>
(node);
200 break;
201 }
202 }
203
204 if (fields_node !=
null)
205 {
206 foreach (XmlNode node
in fields_node.ChildNodes)
207 {
208 fields.AddChild(
new FieldDef(node));
209 }
210 }
211 else
212 {
213 fields =
this.Dom.CreateNode<NodeList<FieldDef>>(
"Fields");
214
215 this.AddChild(fields);
216 }
217 return fields;
218 }
219 set
220 {
221 throw new Exception(
"cannot set");
222 }
223 }
224 public ClassDef CreateClassDef()
225 {
226 return this.Dom.CreateNode<ClassDef>
();
227 }
228
229 public NodeList<ClassDef>
Classes
230 {
231 get
232 {
233 NodeList<ClassDef> classes =
null;
234 XmlNode classes_node =
null;
235
236 foreach (XmlNode node
in this.Dom.ChildNodes)
237 {
238 if (node.Name ==
"Classes")
239 {
240 classes_node =
node;
241 classes =
new NodeList<ClassDef>
(node);
242 break;
243 }
244 }
245
246 if (classes_node !=
null)
247 {
248 foreach (XmlNode node
in classes_node.ChildNodes)
249 {
250 classes.AddChild(
new ClassDef(node));
251 }
252 }
253 else
254 {
255 classes =
this.Dom.CreateNode<NodeList<ClassDef>>(
"Classes");
256
257 this.AddChild(classes);
258 }
259 return classes;
260 }
261 set
262 {
263 throw new Exception(
"cannot set");
264 }
265 }
266 public InitDef CreateInitDef()
267 {
268 return this.Dom.CreateNode<InitDef>
();
269 }
270
271 public InitDef Init
272 {
273 get
274 {
275 foreach (XmlNode node
in this.Dom.ChildNodes)
276 {
277 if (node.Name ==
"InitDef" &&
278 node.Attributes[
"variable"] !=
null &&
279 node.Attributes[
"variable"].Value ==
"Init")
280 {
281 return new InitDef(node);
282 }
283 }
284 return null;
285 }
286 set
287 {
288 if (
this.Init !=
null)
289 {
290 this.Init.RemoveSelf();
291 }
292
293 var attr =
this.Dom.OwnerDocument.CreateAttribute(
"variable");
294 attr.Value =
"Init";
295 value.Dom.Attributes.Append(attr);
296
297 this.Dom.AppendChild(value.Dom);
298 }
299 }
300 public StartStateDef CreateStartStateDef()
301 {
302 return this.Dom.CreateNode<StartStateDef>
();
303 }
304
305 public StartStateDef StartState
306 {
307 get
308 {
309 foreach (XmlNode node
in this.Dom.ChildNodes)
310 {
311 if (node.Name ==
"StartStateDef" &&
312 node.Attributes[
"variable"] !=
null &&
313 node.Attributes[
"variable"].Value ==
"StartState")
314 {
315 return new StartStateDef(node);
316 }
317 }
318 return null;
319 }
320 set
321 {
322 if (
this.StartState !=
null)
323 {
324 this.StartState.RemoveSelf();
325 }
326
327 var attr =
this.Dom.OwnerDocument.CreateAttribute(
"variable");
328 attr.Value =
"StartState";
329 value.Dom.Attributes.Append(attr);
330
331 this.Dom.AppendChild(value.Dom);
332 }
333 }
334 public TerminateStateDef CreateTerminateStateDef()
335 {
336 return this.Dom.CreateNode<TerminateStateDef>
();
337 }
338
339 public TerminateStateDef TerminateState
340 {
341 get
342 {
343 foreach (XmlNode node
in this.Dom.ChildNodes)
344 {
345 if (node.Name ==
"TerminateStateDef" &&
346 node.Attributes[
"variable"] !=
null &&
347 node.Attributes[
"variable"].Value ==
"TerminateState")
348 {
349 return new TerminateStateDef(node);
350 }
351 }
352 return null;
353 }
354 set
355 {
356 if (
this.TerminateState !=
null)
357 {
358 this.TerminateState.RemoveSelf();
359 }
360
361 var attr =
this.Dom.OwnerDocument.CreateAttribute(
"variable");
362 attr.Value =
"TerminateState";
363 value.Dom.Attributes.Append(attr);
364
365 this.Dom.AppendChild(value.Dom);
366 }
367 }
368 public StateDef CreateStateDef()
369 {
370 return this.Dom.CreateNode<StateDef>
();
371 }
372
373 public NodeList<StateDef>
States
374 {
375 get
376 {
377 NodeList<StateDef> states =
null;
378 XmlNode states_node =
null;
379
380 foreach (XmlNode node
in this.Dom.ChildNodes)
381 {
382 if (node.Name ==
"States")
383 {
384 states_node =
node;
385 states =
new NodeList<StateDef>
(node);
386 break;
387 }
388 }
389
390 if (states_node !=
null)
391 {
392 foreach (XmlNode node
in states_node.ChildNodes)
393 {
394 states.AddChild(
new StateDef(node));
395 }
396 }
397 else
398 {
399 states =
this.Dom.CreateNode<NodeList<StateDef>>(
"States");
400
401 this.AddChild(states);
402 }
403 return states;
404 }
405 set
406 {
407 throw new Exception(
"cannot set");
408 }
409 }
410 public ParallelDef CreateParallelDef()
411 {
412 return this.Dom.CreateNode<ParallelDef>
();
413 }
414
415 public NodeList<ParallelDef>
Parallels
416 {
417 get
418 {
419 NodeList<ParallelDef> parallels =
null;
420 XmlNode parallels_node =
null;
421
422 foreach (XmlNode node
in this.Dom.ChildNodes)
423 {
424 if (node.Name ==
"Parallels")
425 {
426 parallels_node =
node;
427 parallels =
new NodeList<ParallelDef>
(node);
428 break;
429 }
430 }
431
432 if (parallels_node !=
null)
433 {
434 foreach (XmlNode node
in parallels_node.ChildNodes)
435 {
436 parallels.AddChild(
new ParallelDef(node));
437 }
438 }
439 else
440 {
441 parallels =
this.Dom.CreateNode<NodeList<ParallelDef>>(
"Parallels");
442
443 this.AddChild(parallels);
444 }
445 return parallels;
446 }
447 set
448 {
449 throw new Exception(
"cannot set");
450 }
451 }
452 public SubFlowStateDef CreateSubFlowStateDef()
453 {
454 return this.Dom.CreateNode<SubFlowStateDef>
();
455 }
456
457 public NodeList<SubFlowStateDef>
SubFlowStates
458 {
459 get
460 {
461 NodeList<SubFlowStateDef> subFlowStates =
null;
462 XmlNode subFlowStates_node =
null;
463
464 foreach (XmlNode node
in this.Dom.ChildNodes)
465 {
466 if (node.Name ==
"SubFlowStates")
467 {
468 subFlowStates_node =
node;
469 subFlowStates =
new NodeList<SubFlowStateDef>
(node);
470 break;
471 }
472 }
473
474 if (subFlowStates_node !=
null)
475 {
476 foreach (XmlNode node
in subFlowStates_node.ChildNodes)
477 {
478 subFlowStates.AddChild(
new SubFlowStateDef(node));
479 }
480 }
481 else
482 {
483 subFlowStates =
this.Dom.CreateNode<NodeList<SubFlowStateDef>>(
"SubFlowStates");
484
485 this.AddChild(subFlowStates);
486 }
487 return subFlowStates;
488 }
489 set
490 {
491 throw new Exception(
"cannot set");
492 }
493 }
494 }
495
496 public class StartStateDef
497 : DataNode
498 {
499 public StartStateDef
500 ()
501 :
base()
502 {
503 }
504
505 public StartStateDef
506 (XmlNode dom)
507 :
base(dom)
508 {
509 }
510
511 public StartStateDef
512 (Document document)
513 :
base(document)
514 {
515 }
516
517 public override string XML_TAG_NAME
518 {
519 get
520 {
521 return "StartStateDef";
522 }
523 set
524 {
525 throw new Exception(
"cannot set");
526 }
527 }
528
529 public event ProperyChanged<
string>
OnId_ProperyChanged;
530 public override string Id
531 {
532 get
533 {
534 if (
this.Dom.Attributes[
"Id"] ==
null)
535 return default(
string);
536 return this.Dom.Attributes[
"Id"].Value.ToT<
string>
();
537 }
538 set
539 {
540 var attr =
this.Dom.Attributes.OfType<XmlAttribute>
()
541 .FirstOrDefault(x => x.Name ==
"Id");
542 var oldValue =
default(
string);
543 var newValue =
value;
544 if (attr ==
null)
545 {
546 attr =
this.Dom.Attributes.Append(
this.Dom.OwnerDocument.CreateAttribute(
"Id"));
547 }
548 else
549 {
550 oldValue =
this.Dom.Attributes[
"Id"].Value.ToT<
string>
();
551 }
552
553 if (value !=
null)
554 attr.Value =
value.ToString();
555
556 if (OnId_ProperyChanged !=
null && oldValue !=
newValue)
557 {
558 OnId_ProperyChanged(oldValue, newValue);
559 }
560 this.FireAnyProperyChanged(
"Id", oldValue, newValue);
561 }
562 }
563 public event ProperyChanged<
string>
OnName_ProperyChanged;
564 public string Name
565 {
566 get
567 {
568 if (
this.Dom.Attributes[
"Name"] ==
null)
569 return default(
string);
570 return this.Dom.Attributes[
"Name"].Value.ToT<
string>
();
571 }
572 set
573 {
574 var attr =
this.Dom.Attributes.OfType<XmlAttribute>
()
575 .FirstOrDefault(x => x.Name ==
"Name");
576 var oldValue =
default(
string);
577 var newValue =
value;
578 if (attr ==
null)
579 {
580 attr =
this.Dom.Attributes.Append(
this.Dom.OwnerDocument.CreateAttribute(
"Name"));
581 }
582 else
583 {
584 oldValue =
this.Dom.Attributes[
"Name"].Value.ToT<
string>
();
585 }
586
587 if (value !=
null)
588 attr.Value =
value.ToString();
589
590 if (OnName_ProperyChanged !=
null && oldValue !=
newValue)
591 {
592 OnName_ProperyChanged(oldValue, newValue);
593 }
594 this.FireAnyProperyChanged(
"Name", oldValue, newValue);
595 }
596 }
597
598 }
599
600 //此处省略3000行...
601 }
View Code
1.2 数据表及关系设计
1.2.1 数据语法如下:
1.2.2 生成数据库sql
1.2.3 生成的sql
1 IF OBJECT_ID(N
'People',N
'U')
IS NOT NULL
2 DROP TABLE [dbo].
[People];
3 CREATE TABLE [dbo].
[People](
4 [Id] int NOT NULL,
5 [Name] nvarchar(
200) ,
6 [UserId] int ,
7 [SchoolId] int ,
8 [Status] int ,
9 CONSTRAINT [PK_People] PRIMARY KEY CLUSTERED
10 (
11 [Id] ASC
12 )
WITH (PAD_INDEX
= OFF, STATISTICS_NORECOMPUTE
= OFF, IGNORE_DUP_KEY
= OFF
13 , ALLOW_ROW_LOCKS
= ON, ALLOW_PAGE_LOCKS
= ON)
ON [PRIMARY]
14 )
ON [PRIMARY]
15
16 GO
View Code
1.3 持久化阶段
1.3.1 新建连接串
1.3.2 刷新链接,获取数据库所有的表和视图信息
刷新结果:
1.3.3 弹出生成操作
1.3.4 实体层生成
1.3.4.1 生成的EF实体类:
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using Domain.Entities;
6 using Domain.AggregateRoot;
7
8 namespace AAA
9 {
10
11 public class People : Entity, IAggregateRoot
12 {
13 public People()
14 {
15 }
16 public People(System.Int32 id)
17 :
base(id)
18 {
19 }
20 /// <summary>
21 ///
22 /// </summary>
23 public DateTime?
CreateTime
24 {
get;
set; }
25
26 /// <summary>
27 ///
28 /// </summary>
29 public String Name
30 {
get;
set; }
31
32 /// <summary>
33 ///
34 /// </summary>
35 public Int32?
SchoolId
36 {
get;
set; }
37
38 /// <summary>
39 ///
40 /// </summary>
41 public Int32?
Status
42 {
get;
set; }
43
44 /// <summary>
45 ///
46 /// </summary>
47 public DateTime?
UpdateTime
48 {
get;
set; }
49
50 /// <summary>
51 ///
52 /// </summary>
53 public Int32?
UserId
54 {
get;
set; }
55
56 /// <summary>
57 ///
58 /// </summary>
59 public virtual User User
60 {
get;
set; }
61
62 /// <summary>
63 ///
64 /// </summary>
65 public virtual School School
66 {
get;
set; }
67
68 public void AssignFrom(People other)
69 {
70 this.CreateTime =
other.CreateTime;
71 this.Name =
other.Name;
72 this.SchoolId =
other.SchoolId;
73 this.Status =
other.Status;
74 this.UpdateTime =
other.UpdateTime;
75 this.UserId =
other.UserId;
76 }
77 }
78 }
View Code
1.3.4.2 生成的EF映射类:
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using Domain.Repository;
6
7 namespace AAA
8 {
9
10 public interface IPeopleRepository : IRepository<People>
, IDisposable
11 {
12 List<People> GetList(List<Guid>
id_list);
13 }
14 }
View Code
弹出生成Repository操作:
1.3.4.3 Repository接口代码:
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using Domain.Repository;
6
7 namespace AAA
8 {
9
10 public interface IPeopleRepository : IRepository<People>
, IDisposable
11 {
12 List<People> GetList(List<Guid>
id_list);
13 }
14 }
View Code
1.3.4.4 Specification规约代码:
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using Domain.Specification;
6
7 namespace AAA
8 {
9
10 public static class PeopleSpecification
11 {
12 public static ISpecification<People> GetList(List<Guid>
id_list)
13 {
14 return new DirectSpecification<People>(x =>
id_list.Contains(x.Id));
15 }
16 }
17 }
View Code
1.3.4.5 Repository实现代码:
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using Data;
6 using Data.Repository;
7
8 namespace AAA
9 {
10
11 public class PeopleRepository : Repository<People>
, IPeopleRepository
12 {
13 public PeopleRepository(IQueryableUnitOfWork unitOfWork)
14 :
base(unitOfWork)
15 {
16 }
17
18 public List<People> GetList(List<Guid>
id_list)
19 {
20 return this.GetAll(PeopleSpecification.GetList(id_list)).ToList();
21 }
22
23 public void Dispose()
24 {
25 //throw new NotImplementedException();
26 }
27 }
28 }
View Code
1.3.5 Service层生成
1.3.5.1 弹出生成WCF操作:
1.3.5.2 生成DTO代码:
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Runtime.Serialization;
6
7 namespace AAA
8 {
9
10 [DataContract]
11 public class PeopleDto
12 {
13 /// <summary>
14 ///
15 /// </summary>
16 [DataMember]
17 public DateTime?
CreateTime
18 {
get;
set; }
19
20 /// <summary>
21 ///
22 /// </summary>
23 [DataMember]
24 public Int32 Id
25 {
get;
set; }
26
27 /// <summary>
28 ///
29 /// </summary>
30 [DataMember]
31 public String Name
32 {
get;
set; }
33
34 /// <summary>
35 ///
36 /// </summary>
37 [DataMember]
38 public Int32?
SchoolId
39 {
get;
set; }
40
41 /// <summary>
42 ///
43 /// </summary>
44 [DataMember]
45 public Int32?
Status
46 {
get;
set; }
47
48 /// <summary>
49 ///
50 /// </summary>
51 [DataMember]
52 public DateTime?
UpdateTime
53 {
get;
set; }
54
55 /// <summary>
56 ///
57 /// </summary>
58 [DataMember]
59 public Int32?
UserId
60 {
get;
set; }
61
62 }
63 }
View Code
1.3.5.3 生成实体转DTO代码:(建议用automap替代)
1 public static PeopleDto ConvertToPeopleDto(People entity)
2 {
3 return new PeopleDto{
4 Id =
entity.Id,
5 Name =
entity.Name,
6 SchoolId =
entity.SchoolId,
7 Status =
entity.Status,
8 UserId =
entity.UserId,
9 };
10 }
View Code
1.3.5.4 生成DTO转实体代码:(建议用automap替代)
1 public static People ConvertToPeople(PeopleDto entityDto)
2 {
3 return new People(entityDto.Id){
4 Name =
entityDto.Name,
5 SchoolId =
entityDto.SchoolId,
6 Status =
entityDto.Status,
7 UserId =
entityDto.UserId,
8 };
9 }
View Code
1.3.5.5 生成基本Servie代码:(基础增删改查)
1 #region App Service Interface
2
3 ReturnInfoDto AddPeople(PeopleDto peopleDto);
4
5 ReturnInfoDto UpdatePeople(PeopleDto peopleDto);
6
7 ReturnInfoDto<PeopleDto>
GetPeople(Guid id);
8
9 ReturnInfoDto<List<PeopleDto>> GetPeopleList(List<Guid>
id_list);
10
11 ReturnInfoDto DeletePeople(Guid id);
12
13 ReturnInfoDto DeletePeople(List<Guid>
id_list);
14
15 #endregion
16
17 #region App Service Implement
18
19 public ReturnInfoDto AddPeople(PeopleDto peopleDto)
20 {
21 var rtnInfo =
new ReturnInfoDto();
22 rtnInfo.Message =
string.Empty;
23 rtnInfo.IsSuccess =
false;
24 try
25 {
26 using (
var unitOfWork =
UnitOfWorkFactory.Create(DbOption.OA))
27 {
28 var peopleDB =
new PeopleRepository(unitOfWork);
29 var people =
DataConverter.ConvertToPeople(peopleDto);
30 peopleDB.Add(people);
31 unitOfWork.Commit();
32 }
33 }
34 catch (Exception ex)
35 {
36 rtnInfo.Message =
ex.Message;
37 return rtnInfo;
38 }
39
40 rtnInfo.IsSuccess =
true;
41 return rtnInfo;
42 }
43
44 public ReturnInfoDto UpdatePeople(PeopleDto peopleDto)
45 {
46 var rtnInfo =
new ReturnInfoDto();
47 rtnInfo.Message =
string.Empty;
48 rtnInfo.IsSuccess =
false;
49 try
50 {
51 using (
var unitOfWork =
UnitOfWorkFactory.Create(DbOption.OA))
52 {
53 var peopleDB =
new PeopleRepository(unitOfWork);
54 var info =
peopleDB.Get(peopleDto.Id);
55 if (info ==
null)
56 {
57 rtnInfo.Message =
"the data is not in system.";
58 return rtnInfo;
59 }
60 var other =
DataConverter.ConvertToPeople(peopleDto);
61 info.AssignFrom(other);
62 peopleDB.Modify(info);
63 unitOfWork.Commit();
64 }
65 }
66 catch (Exception ex)
67 {
68 rtnInfo.Message =
ex.Message;
69 return rtnInfo;
70 }
71
72 rtnInfo.IsSuccess =
true;
73 return rtnInfo;
74 }
75
76 public ReturnInfoDto<PeopleDto>
GetPeople(Guid id)
77 {
78 var rtnInfo =
new ReturnInfoDto<PeopleDto>
();
79 rtnInfo.Message =
string.Empty;
80 rtnInfo.IsSuccess =
false;
81 try
82 {
83 using (
var unitOfWork =
UnitOfWorkFactory.Create(DbOption.OA))
84 {
85 var peopleDB =
new PeopleRepository(unitOfWork);
86 var people =
peopleDB.Get(id);
87 if(people !=
null)
88 {
89 rtnInfo.Data =
DataConverter.ConvertToPeopleDto(people);
90 }
91 }
92 }
93 catch (Exception ex)
94 {
95 rtnInfo.Message =
ex.Message;
96 return rtnInfo;
97 }
98
99 rtnInfo.IsSuccess =
true;
100 return rtnInfo;
101 }
102
103 public ReturnInfoDto<List<PeopleDto>> GetPeopleList(List<Guid>
id_list)
104 {
105 var rtnInfo =
new ReturnInfoDto<List<PeopleDto>>
();
106 rtnInfo.Message =
string.Empty;
107 rtnInfo.IsSuccess =
false;
108 rtnInfo.Data =
new List<PeopleDto>
();
109 try
110 {
111 using (
var unitOfWork =
UnitOfWorkFactory.Create(DbOption.OA))
112 {
113 var peopleDB =
new PeopleRepository(unitOfWork);
114 var list =
peopleDB.GetList(id_list);
115 if(list !=
null && list.Count >
0 )
116 {
117 list.ForEach( x =>
rtnInfo.Data.Add(DataConverter.ConvertToPeopleDto(x)));
118 }
119 }
120 }
121 catch (Exception ex)
122 {
123 rtnInfo.Message =
ex.Message;
124 return rtnInfo;
125 }
126
127 rtnInfo.IsSuccess =
true;
128 return rtnInfo;
129 }
130
131 public ReturnInfoDto DeletePeople(Guid id)
132 {
133 var rtnInfo =
new ReturnInfoDto();
134 rtnInfo.Message =
string.Empty;
135 rtnInfo.IsSuccess =
false;
136 try
137 {
138 using (
var unitOfWork =
UnitOfWorkFactory.Create(DbOption.OA))
139 {
140 var peopleDB =
new PeopleRepository(unitOfWork);
141 var people =
peopleDB.Get(id);
142 if(people ==
null )
143 {
144 rtnInfo.Message =
"the data is not in system.";
145 return rtnInfo;
146 }
147 //people.Available = false;
148 //peopleDB.Modify(people);
149 peopleDB.Remove(people);
150 unitOfWork.Commit();
151 }
152 }
153 catch (Exception ex)
154 {
155 rtnInfo.Message =
ex.Message;
156 return rtnInfo;
157 }
158
159 rtnInfo.IsSuccess =
true;
160 return rtnInfo;
161 }
162
163 public ReturnInfoDto DeletePeople(List<Guid>
id_list)
164 {
165 var rtnInfo =
new ReturnInfoDto();
166 rtnInfo.Message =
string.Empty;
167 rtnInfo.IsSuccess =
false;
168 try
169 {
170 using (
var unitOfWork =
UnitOfWorkFactory.Create(DbOption.OA))
171 {
172 var peopleDB =
new PeopleRepository(unitOfWork);
173 var people_list =
peopleDB.GetList(id_list);
174 foreach (
var people
in people_list)
175 {
176 //people.Available = false;
177 //peopleDB.Modify(people);
178 peopleDB.Remove(people);
179 }
180 unitOfWork.Commit();
181 }
182 }
183 catch (Exception ex)
184 {
185 rtnInfo.Message =
ex.Message;
186 return rtnInfo;
187 }
188
189 rtnInfo.IsSuccess =
true;
190 return rtnInfo;
191 }
192
193 #endregion
194
195 #region Distribute Service Interface
196
197 [OperationContract]
198 [WithoutAuthorization]
199 [FaultContractAttribute(
typeof(UnAuthorization))]
200 ReturnInfoDto AddPeople(PeopleDto peopleDto);
201
202 [OperationContract]
203 [WithoutAuthorization]
204 [FaultContractAttribute(
typeof(UnAuthorization))]
205 ReturnInfoDto UpdatePeople(PeopleDto peopleDto);
206
207 [OperationContract]
208 [WithoutAuthorization]
209 [FaultContractAttribute(
typeof(UnAuthorization))]
210 ReturnInfoDto<PeopleDto>
GetPeople(Guid id);
211
212 [OperationContract]
213 [WithoutAuthorization]
214 [FaultContractAttribute(
typeof(UnAuthorization))]
215 ReturnInfoDto<List<PeopleDto>> GetPeopleList(List<Guid>
id_list);
216
217 [OperationContract]
218 [WithoutAuthorization]
219 [FaultContractAttribute(
typeof(UnAuthorization))]
220 ReturnInfoDto DeletePeople(Guid id);
221
222 [OperationContract]
223 [WithoutAuthorization]
224 [FaultContractAttribute(
typeof(UnAuthorization))]
225 ReturnInfoDto DeletePeopleList(List<Guid>
id_list);
226
227 #endregion
228
229 #region Distribute Service Implement
230
231 public ReturnInfoDto AddPeople(PeopleDto peopleDto)
232 {
233 return _appService.AddPeople(peopleDto);
234 }
235
236 public ReturnInfoDto UpdatePeople(PeopleDto peopleDto)
237 {
238 return _appService.UpdatePeople(peopleDto);
239 }
240
241 public ReturnInfoDto<PeopleDto>
GetPeople(Guid id)
242 {
243 return _appService.GetPeople( id );
244 }
245
246 public ReturnInfoDto<List<PeopleDto>> GetPeopleList(List<Guid>
id_list)
247 {
248 return _appService.GetPeopleList( id_list );
249 }
250
251 public ReturnInfoDto DeletePeople(Guid id)
252 {
253 return _appService.DeletePeople( id );
254 }
255
256 public ReturnInfoDto DeletePeopleList(List<Guid>
id_list)
257 {
258 return _appService.DeletePeople( id_list );
259 }
260
261 #endregion
262
263 #region Service Layer
264
265 public ReturnInfo AddPeople(PeopleInfo peopleInfo)
266 {
267 var result =
new ReturnInfo();
268
269 try
270 {
271 var dto =
DataConverter.ConvertToPeopleDto(peopleInfo);
272 var rslt = serviceClient.Invoke<ReturnInfoDto>(x =>
x.AddPeople(dto));
273 result.IsSuccess =
rslt.IsSuccess;
274 result.Message =
rslt.Message;
275
276 }
277 catch (Exception e)
278 {
279 LogHelper.Error(e);
280 result.IsSuccess =
false;
281 result.Message =
"call service error";
282 }
283
284 return result;
285 }
286
287 public ReturnInfo UpdatePeople(PeopleInfo peopleInfo)
288 {
289 var result =
new ReturnInfo();
290
291 try
292 {
293 var dto =
DataConverter.ConvertToPeopleDto(peopleInfo);
294 var rslt = serviceClient.Invoke<ReturnInfoDto>(x =>
x.UpdatePeople(dto));
295 result.IsSuccess =
rslt.IsSuccess;
296 result.Message =
rslt.Message;
297
298 }
299 catch (Exception e)
300 {
301 LogHelper.Error(e);
302 result.IsSuccess =
false;
303 result.Message =
"call service error";
304 }
305
306 return result;
307 }
308
309 public ReturnInfo<PeopleInfo>
GetPeople(Guid id)
310 {
311 var result =
new ReturnInfo<PeopleInfo>
();
312
313 try
314 {
315 var rslt = serviceClient.Invoke<ReturnInfoDto<PeopleDto>>(x =>
x.GetPeople(id));
316 result.Data =
DataConverter.ConvertToPeopleInfo(rslt.Data);
317 result.IsSuccess =
rslt.IsSuccess;
318 result.Message =
rslt.Message;
319
320 }
321 catch (Exception e)
322 {
323 LogHelper.Error(e);
324 result.IsSuccess =
false;
325 result.Message =
"call service error";
326 }
327
328 return result;
329 }
330
331 public ReturnInfo<List<PeopleInfo>> GetPeopleList(List<Guid>
id_list)
332 {
333 var result =
new ReturnInfo<List<PeopleInfo>>
();
334 result.Data =
new List<PeopleInfo>
();
335
336 try
337 {
338 var rslt = serviceClient.Invoke<ReturnInfoDto<List<PeopleDto>>>(x =>
x.GetPeopleList(id_list));
339 result.IsSuccess =
rslt.IsSuccess;
340 result.Message =
rslt.Message;
341 if (rslt.IsSuccess )
342 {
343 if (rslt.Data !=
null && rslt.Data.Count >
0)
344 {
345 rslt.Data.ForEach(x =>
result.Data.Add(DataConverter.ConvertToPeopleInfo(x)));
346 }
347 }
348 }
349 catch (Exception e)
350 {
351 LogHelper.Error(e);
352 result.IsSuccess =
false;
353 result.Message =
"call service error";
354 }
355
356 return result;
357 }
358
359 public ReturnInfo DeletePeople(Guid id)
360 {
361 var result =
new ReturnInfo();
362
363 try
364 {
365 var rslt = serviceClient.Invoke<ReturnInfoDto>(x =>
x.DeletePeople(id));
366 result.IsSuccess =
rslt.IsSuccess;
367 result.Message =
rslt.Message;
368
369 }
370 catch (Exception e)
371 {
372 LogHelper.Error(e);
373 result.IsSuccess =
false;
374 result.Message =
"call service error";
375 }
376
377 return result;
378 }
379
380 public ReturnInfo DeletePeople(List<Guid>
id_list)
381 {
382 var result =
new ReturnInfo();
383
384 try
385 {
386 var rslt = serviceClient.Invoke<ReturnInfoDto>(x =>
x.DeletePeopleList(id_list));
387 result.IsSuccess =
rslt.IsSuccess;
388 result.Message =
rslt.Message;
389
390 }
391 catch (Exception e)
392 {
393 LogHelper.Error(e);
394 result.IsSuccess =
false;
395 result.Message =
"call service error";
396 }
397
398 return result;
399 }
400
401 #endregion
View Code
1.3.5.6 生成CCFlowService:此处省略(比较私有)
1.3.6 Web层生成
1.3.6.1 弹出ViewMode生成操作:
1.3.6.2 生成ViewModel代码:
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Runtime.Serialization;
6
7 namespace AAA
8 {
9
10 public class PeopleInfo
11 {
12 /// <summary>
13 ///
14 /// </summary>
15 public DateTime?
CreateTime
16 {
get;
set; }
17
18 /// <summary>
19 ///
20 /// </summary>
21 public Int32 Id
22 {
get;
set; }
23
24 /// <summary>
25 ///
26 /// </summary>
27 public String Name
28 {
get;
set; }
29
30 /// <summary>
31 ///
32 /// </summary>
33 public Int32?
SchoolId
34 {
get;
set; }
35
36 /// <summary>
37 ///
38 /// </summary>
39 public Int32?
Status
40 {
get;
set; }
41
42 /// <summary>
43 ///
44 /// </summary>
45 public DateTime?
UpdateTime
46 {
get;
set; }
47
48 /// <summary>
49 ///
50 /// </summary>
51 public Int32?
UserId
52 {
get;
set; }
53
54 }
55 }
View Code
1.3.6.3 生成ViewModel转WCF DTO代码:(建议用automapper替代)
1 public static PeopleDto ConvertToPeopleDto(PeopleInfo info)
2 {
3 return new PeopleDto{
4 Id =
info.Id,
5 Name =
info.Name,
6 SchoolId =
info.SchoolId,
7 Status =
info.Status,
8 UserId =
info.UserId,
9 };
10 }
View Code
1.3.6.4 生成WCF DTO转ViewModel代码:(建议用automapper替代)
1 public static PeopleInfo ConvertToPeopleInfo(PeopleDto dto )
2 {
3 return new PeopleInfo(){
4 Id =
dto.Id,
5 Name =
dto.Name,
6 SchoolId =
dto.SchoolId,
7 Status =
dto.Status,
8 UserId =
dto.UserId,
9 };
10 }
View Code
1.3.6.5 弹出生成View操作:
1.3.6.6 生成编辑页面Model代码:
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Runtime.Serialization;
6 namespace AAA
7 {
8
9 public class PeopleInfo
10 {
11 /// <summary>
12 ///
13 /// </summary>
14 public DateTime?
CreateTime
15 {
get;
set; }
16
17 /// <summary>
18 ///
19 /// </summary>
20 public Int32 Id
21 {
get;
set; }
22
23 /// <summary>
24 ///
25 /// </summary>
26 public String Name
27 {
get;
set; }
28
29 /// <summary>
30 ///
31 /// </summary>
32 public Int32?
SchoolId
33 {
get;
set; }
34
35 /// <summary>
36 ///
37 /// </summary>
38 public Int32?
Status
39 {
get;
set; }
40
41 /// <summary>
42 ///
43 /// </summary>
44 public DateTime?
UpdateTime
45 {
get;
set; }
46
47 /// <summary>
48 ///
49 /// </summary>
50 public Int32?
UserId
51 {
get;
set; }
52
53 }
54 }
View Code
1.3.6.7 生成编辑页面代码:
1 @model EditPeopleModel
2 @{
3 Layout = "~/Views/Shared/_SimpleLayout.cshtml";
4
5 if(this.Model.Id.HasValue){
6 ViewBag.Title = "Edit Item";
7 }
8 else{
9 ViewBag.Title = "Add Item";
10 }
11 }
12
13 @section js{
14 <script src="../../Scripts/jquery.validate.js" type="text/javascript"></script>
15 <script language = "javascript" type="text/javascript">
16 function OnClose(refresh) {
17 if (parent.MsgBox != undefined) {
18
19 if (refresh) {
20 if (parent.MsgBox.Callback != null) {
21 parent.MsgBox.Callback();
22 parent.MsgBox.Callback = null;
23 }
24 }
25 parent.MsgBox.Callback = null;
26
27 parent.MsgBox.Close();
28
29 }
30 else {
31 window.close();
32 }
33 }
34
35 $(function () {
36
37 if (parent.MsgBox != undefined) {
38 parent.MsgBox.CancelCallback = true;
39 }
40
41 $('#btnSaveAndClose').click(function () {
42
43 $('#IsSave').val(true);
44
45 $('#editForm').submit();
46
47 });
48
49 $('#btnCancel').click(function () {
50
51 OnClose();
52
53 });
54
55 if ($('#IsSave').val() == 'True') {
56 var msg = $('#ErrorMsg').val();
57 if (msg == '') {
58 jAlert('Save Success','Tip',function(){
59 OnClose(true);
60 });
61 }
62 else {
63 jAlert(msg);
64 }
65 }
66
67 $('#somecontrolId').attr('readonly','true').addClass('readonly');
68
69 $('select').each(function(){
70 $(this).val($(this).attr('_value'));
71 });
72
73 var validator = $('#editForm').validate({
74 debug: true, //调试模式取消submit的默认提交功能
75 errorClass: 'error', //默认为错误的样式类为:error
76 focusInvalid: false,
77 onkeyup: false,
78 submitHandler: function (form) { //表单提交句柄,为一回调函数,带一个参数:form
79 //alert('提交表单');
80 form.submit(); //提交表单
81 },
82 rules: { //定义验证规则,其中属性名为表单的name属性
83 Name:{
84 },
85 SchoolId:{
86 },
87 Status:{
88 },
89 UserId:{
90 }
91
92 },
93
94 messages: { //自定义验证消息
95 PurchasePlan: {
96 //required: 'required !',
97 //minlength: $.format('用户名至少要{0}个字符!'),
98 //remote: $.format('{0}已经被占用')
99 },
100 },
101 errorPlacement: function (error, element) {
102 var noHtml = '<div class="notification error" for="' + error.attr('for') + '">' +
103 "<a class=\"close\" ><img alt=\"close\" title=\"Close this notification\" src=\"/Content/images/cross_grey_small.png\"></a>" +
104 '<div>' + error.html() + '</div>' + '</div>';
105 var notification = element.parent().find('div');
106 if (notification.length > 0) {
107 notification.remove();
108 }
109 element.parent().find('span').hide();
110 $(noHtml).appendTo(element.parent());
111 error.html('');
112 error.appendTo(element.parent());
113 },
114 highlight: function (element, errorClass) { //针对验证的表单设置高亮
115 //$(element).addClass(errorClass);
116 },
117 success: function (element) {
118 element.parent().find('span').show();
119 element.parent().find('div.error,label.validateError').remove();
120 }});
121 });
122 </script>
123
124 }
125
126 @section css{
127
128 <style type="text/css">
129 body
130 {
131 background: none;
132 }
133 .field
134 {
135 vertical-align: middle;
136 clear: both;
137 padding-left: 5px;
138 padding-top: 5px;
139 padding-bottom: 5px;
140 }
141 .field_name
142 {
143 width: 160px;
144 float: left;
145 padding-right: 10px;
146 padding-top: 10px;
147 margin: 0 auto;
148 }
149 .field_value
150 {
151 width: 260px;
152 float: left;
153 }
154 custom-combobox input
155 {
156 width: 120px;
157 }
158 .operation
159 {
160 margin-top: 20px;
161 padding-top: 20px;
162 clear: both;
163 }
164 input
165 {
166 width: 206px;
167 }
168 select
169 {
170 width: 220px;
171 }
172 .readonly
173 {
174 background-color: #e6e6e6;
175 }
176 </style>
177
178 }
179
180 <div class="tabmini-content">
181 <form method="post" id="editForm" class="form" action="/xxx/EditPeopleItem">
182
183 <input type='hidden' id='Id' name='Id' value='@Model.Id' />
184 <input type='hidden' id='IsPostBack' name='IsPostBack' value='true' />
185 <input type='hidden' id='IsSave' name='IsSave' value='@Model.IsSave' />
186 <input type='hidden' id='ErrorMsg' name='ErrorMsg' value='@Model.ErrorMsg' />
187
188 <fieldset class="ConfigArea">
189 <div class="field">
190 <div class="field_name">
191 <label>Name:
</label>
192 </div>
193 <div class="field_value">
194 <input type="text" name="Name" id="Name" value="@Model.Name"/>
195 </div>
196 </div>
197 <div class="field">
198 <div class="field_name">
199 <label>SchoolId:
</label>
200 </div>
201 <div class="field_value">
202 <input type="text" name="SchoolId" id="SchoolId" value="@Model.SchoolId"/>
203 </div>
204 </div>
205 <div class="field">
206 <div class="field_name">
207 <label>Status:
</label>
208 </div>
209 <div class="field_value">
210 <input type="text" name="Status" id="Status" value="@Model.Status"/>
211 </div>
212 </div>
213 <div class="field">
214 <div class="field_name">
215 <label>UserId:
</label>
216 </div>
217 <div class="field_value">
218 <input type="text" name="UserId" id="UserId" value="@Model.UserId"/>
219 </div>
220 </div>
221 <div class='operation'>
222 <a class='button blue' id='btnSaveAndClose'>Save
&Close</a> <a class='button blue'
223 id='btnCancel'>Cancel
</a>
224 </div>
225 </fieldset>
226 </form>
227 </div>
View Code
1.3.6.8 弹出生成MVC代码操作:
1.3.6.9 生成Action代码:
1 public ActionResult EditPeople(EditPeopleModel model)
2 {
3
4 //model.UserId = Motorola.ZCH49.OaSystem.WebSite.Models.User.GetCurrentUser(this).Id;
5 model.Action();
6 return View(model);
7
8 }
9
10 [HttpPost]
11 public ActionResult DeletePeople(Guid id)
12 {
13 var model =
new ReturnInfo();
14
15 if (id ==
default(Guid))
16 {
17 model.Message =
"no id";
18 }
19 else
20 {
21 model =
EditPeopleModel.DeletePeople(id);
22 }
23 return Json(model, JsonRequestBehavior.AllowGet);
24
25 }
26
27 [HttpPost]
28 public ActionResult DeletePeople(List<Guid>
idList)
29 {
30 var model =
new ReturnInfo();
31
32 if (idList ==
null || idList.Count ==
0)
33 {
34 model.Message =
"no id";
35 }
36 else
37 {
38 model =
EditPeopleModel.DeletePeople(idList);
39 }
40 return Json(model, JsonRequestBehavior.AllowGet);
41
42 }
View Code
1.3.7 视图的相关操作和表操作一样
1.4 自定义查询(解决常见查询动态参数化问题)
1.4.1 创建查询集(类似文件夹/目录概念,对查询进行管理)
1.4.2 创建查询
1.4.3 编辑查询
语法和语义同标准sql,主要用于动态的参数化查询,一下为一个常用查询的参数化(分页,各字段的排序,参数提取)
实例代码主要是EF查相关,其他的代码生成省略。
1.4.3.1 生成的查询条件类:
1 using System;
2 using System.Collections.Generic;
3
4 namespace xxx
5 {
6 public class People_Query_Condition
7 {
8 public enum OrderByType
9 {
10 CreateTime_Asc,
11 CreateTime_Desc,
12 Id_Asc,
13 Id_Desc,
14 Name_Asc,
15 Name_Desc,
16 SchoolId_Asc,
17 SchoolId_Desc,
18 Status_Asc,
19 Status_Desc,
20 UpdateTime_Asc,
21 UpdateTime_Desc,
22 UserId_Asc,
23 UserId_Desc,
24
25 }
26
27 public OrderByType? OrderBy {
get;
set; }
28
29 public DateTime?
CreateTime_Begin
30 {
get;
set; }
31
32 public DateTime?
CreateTime_End
33 {
get;
set; }
34
35 public int?
Id
36 {
get;
set; }
37
38 public List<
int>
Ids
39 {
get;
set; }
40
41 public string Name
42 {
get;
set; }
43
44 public int?
SchoolId
45 {
get;
set; }
46
47 public int?
Status
48 {
get;
set; }
49
50 public int?
UserId
51 {
get;
set; }
52
53
54 public int PageIndex {
get;
set; }
55 public int PageSize {
get;
set; }
56 public int RecordCount {
get;
set; }
57 public People_Query_Condition()
58 {
59 this.Ids =
new List<
int>
();
60 }
61 }
62 }
View Code
1.4.3.2 生成的查询DTO类:
1 using System;
2 using System.Collections.Generic;
3 using System.Runtime.Serialization;
4
5 namespace xxx
6 {
7 [DataContract]
8 public class People_Query_ConditionDto
9 {
10 [DataContract]
11 public enum OrderByType
12 {
13 [EnumMember]
14 CreateTime_Asc,
15 [EnumMember]
16 CreateTime_Desc,
17 [EnumMember]
18 Id_Asc,
19 [EnumMember]
20 Id_Desc,
21 [EnumMember]
22 Name_Asc,
23 [EnumMember]
24 Name_Desc,
25 [EnumMember]
26 SchoolId_Asc,
27 [EnumMember]
28 SchoolId_Desc,
29 [EnumMember]
30 Status_Asc,
31 [EnumMember]
32 Status_Desc,
33 [EnumMember]
34 UpdateTime_Asc,
35 [EnumMember]
36 UpdateTime_Desc,
37 [EnumMember]
38 UserId_Asc,
39 [EnumMember]
40 UserId_Desc,
41
42 }
43
44 [DataMember]
45 public OrderByType? OrderBy {
get;
set; }
46
47 [DataMember]
48 public DateTime?
CreateTime_Begin
49 {
get;
set; }
50
51 [DataMember]
52 public DateTime?
CreateTime_End
53 {
get;
set; }
54
55 [DataMember]
56 public int?
Id
57 {
get;
set; }
58
59 [DataMember]
60 public List<
int>
Ids
61 {
get;
set; }
62
63 [DataMember]
64 public string Name
65 {
get;
set; }
66
67 [DataMember]
68 public int?
SchoolId
69 {
get;
set; }
70
71 [DataMember]
72 public int?
Status
73 {
get;
set; }
74
75 [DataMember]
76 public int?
UserId
77 {
get;
set; }
78
79 [DataMember]
80 public int PageIndex {
get;
set; }
81 [DataMember]
82 public int PageSize {
get;
set; }
83 [DataMember]
84 public int RecordCount {
get;
set; }
85 public People_Query_ConditionDto()
86 {
87 this.Ids =
new List<
int>
();
88 }
89 }
90 }
View Code
1.4.3.3 生成的EF规约代码:
1 public static ISpecification<People>
People_Query(People_Query_Condition condition)
2 {
3 ISpecification<People> id_spec =
null;
4 if (!
condition.Id.HasValue)
5 {
6 id_spec =
new DirectSpecification<People>(x=>
true);
7 }
8 else{
9 id_spec =
new DirectSpecification<People>(x=>
10 x.Id ==
condition.Id
11 );
12 }
13
14 ISpecification<People> ids_spec =
null;
15 if (condition.Ids ==
null || condition.Ids.Count ==
0)
16 {
17 ids_spec =
new DirectSpecification<People>(x=>
true);
18 }
19 else{
20 }
21
22 ISpecification<People> name_spec =
null;
23 if (
string.IsNullOrWhiteSpace(condition.Name))
24 {
25 name_spec =
new DirectSpecification<People>(x=>
true);
26 }
27 else{
28 name_spec =
new DirectSpecification<People>(x=>
29 x.Name.Contains(condition.Name)
30 );
31 }
32
33 ISpecification<People> schoolId_spec =
null;
34 if (!
condition.SchoolId.HasValue)
35 {
36 schoolId_spec =
new DirectSpecification<People>(x=>
true);
37 }
38 else{
39 schoolId_spec =
new DirectSpecification<People>(x=>
40 x.SchoolId ==
condition.SchoolId
41 );
42 }
43
44 ISpecification<People> status_spec =
null;
45 if (!
condition.Status.HasValue)
46 {
47 status_spec =
new DirectSpecification<People>(x=>
true);
48 }
49 else{
50 status_spec =
new DirectSpecification<People>(x=>
51 x.Status ==
condition.Status
52 );
53 }
54
55 ISpecification<People> userId_spec =
null;
56 if (!
condition.UserId.HasValue)
57 {
58 userId_spec =
new DirectSpecification<People>(x=>
true);
59 }
60 else{
61 userId_spec =
new DirectSpecification<People>(x=>
62 x.UserId ==
condition.UserId
63 );
64 }
65
66 ISpecification<People> createTime_Begin_spec =
null;
67 if (!
condition.CreateTime_Begin.HasValue)
68 {
69 createTime_Begin_spec =
new DirectSpecification<People>(x=>
true);
70 }
71 else{
72 createTime_Begin_spec =
new DirectSpecification<People>(x=>
73 x.CreateTime >=
condition.CreateTime_Begin
74 );
75 }
76
77 ISpecification<People> createTime_End_spec =
null;
78 if (!
condition.CreateTime_End.HasValue)
79 {
80 createTime_End_spec =
new DirectSpecification<People>(x=>
true);
81 }
82 else{
83 createTime_End_spec =
new DirectSpecification<People>(x=>
84 x.CreateTime <=
condition.CreateTime_End
85 );
86 }
87
88 var name_spec =
new DirectSpecification<People>(x=>
89 (x.Name??
"") !=
""
90 );
91
92 ISpecification<People> id_ids =
new AndSpecification<People>
(id_spec,ids_spec);
93 ISpecification<People> id_ids_name =
new AndSpecification<People>
(id_ids,name_spec);
94 ISpecification<People> id_ids_name_schoolId =
new AndSpecification<People>
(id_ids_name,schoolId_spec);
95 ISpecification<People> id_ids_name_schoolId_status =
new AndSpecification<People>
(id_ids_name_schoolId,status_spec);
96 ISpecification<People> id_ids_name_schoolId_status_userId =
new AndSpecification<People>
(id_ids_name_schoolId_status,userId_spec);
97 ISpecification<People> id_ids_name_schoolId_status_userId_createTime_Begin =
new AndSpecification<People>
(id_ids_name_schoolId_status_userId,createTime_Begin_spec);
98 ISpecification<People> id_ids_name_schoolId_status_userId_createTime_Begin_createTime_End =
new AndSpecification<People>
(id_ids_name_schoolId_status_userId_createTime_Begin,createTime_End_spec);
99 ISpecification<People> id_ids_name_schoolId_status_userId_createTime_Begin_createTime_End_name =
new AndSpecification<People>
(id_ids_name_schoolId_status_userId_createTime_Begin_createTime_End,name_spec);
100 return id_ids_name_schoolId_status_userId_createTime_Begin_createTime_End_name;
101 }
View Code
1.4.3.4 生成的EF存取代码:
1 public PageOfReturn<People>
People_Query( People_Query_Condition condition )
2 {
3 var data =
this.GetAll( PeopleSpecification.People_Query(condition ));
4 if( condition.OrderBy.HasValue )
5 {
6 switch(condition.OrderBy)
7 {
8 case People_Query_Condition.OrderByType.CreateTime_Asc:
9 data = data.OrderBy(x=>
x.CreateTime);
10 break;
11 case People_Query_Condition.OrderByType.CreateTime_Desc:
12 data = data.OrderByDescending(x=>
x.CreateTime);
13 break;
14 case People_Query_Condition.OrderByType.Id_Asc:
15 data = data.OrderBy(x=>
x.Id);
16 break;
17 case People_Query_Condition.OrderByType.Id_Desc:
18 data = data.OrderByDescending(x=>
x.Id);
19 break;
20 case People_Query_Condition.OrderByType.Name_Asc:
21 data = data.OrderBy(x=>
x.Name);
22 break;
23 case People_Query_Condition.OrderByType.Name_Desc:
24 data = data.OrderByDescending(x=>
x.Name);
25 break;
26 case People_Query_Condition.OrderByType.SchoolId_Asc:
27 data = data.OrderBy(x=>
x.SchoolId);
28 break;
29 case People_Query_Condition.OrderByType.SchoolId_Desc:
30 data = data.OrderByDescending(x=>
x.SchoolId);
31 break;
32 case People_Query_Condition.OrderByType.Status_Asc:
33 data = data.OrderBy(x=>
x.Status);
34 break;
35 case People_Query_Condition.OrderByType.Status_Desc:
36 data = data.OrderByDescending(x=>
x.Status);
37 break;
38 case People_Query_Condition.OrderByType.UpdateTime_Asc:
39 data = data.OrderBy(x=>
x.UpdateTime);
40 break;
41 case People_Query_Condition.OrderByType.UpdateTime_Desc:
42 data = data.OrderByDescending(x=>
x.UpdateTime);
43 break;
44 case People_Query_Condition.OrderByType.UserId_Asc:
45 data = data.OrderBy(x=>
x.UserId);
46 break;
47 case People_Query_Condition.OrderByType.UserId_Desc:
48 data = data.OrderByDescending(x=>
x.UserId);
49 break;
50 default:
51 break;
52 }
53 }
54 var result =
new PageOfReturn<People>
();
55 result.RecordCount =
data.Count();
56 result.PageIndex =
condition.PageIndex;
57 result.PageSize =
condition.PageSize;
58 result.PageRecords = data.Skip(condition.PageSize * (condition.PageIndex -
1)).Take(condition.PageSize).ToList();
59 return result;
60 }
View Code
1.4.3.5 其他层如Service,Web层。基本上代码少量改动一下就可以实现一个列表页面。实例代码省略
1.4.4 多表查询
1.4.4.1 生成的查询条件类:
1 using System;
2 using System.Collections.Generic;
3
4 namespace xxx
5 {
6 public class GetPeopleInfo_Condition
7 {
8 public string SchoolName
9 {
get;
set; }
10
11 public int?
Status
12 {
get;
set; }
13
14
15 public GetPeopleInfo_Condition()
16 {
17 }
18 }
19 }
View Code
1.4.4.2 生成的查询条件DTO类:
1 using System;
2 using System.Collections.Generic;
3 using System.Runtime.Serialization;
4
5 namespace xxx
6 {
7 [DataContract]
8 public class GetPeopleInfo_ConditionDto
9 {
10 [DataMember]
11 public string SchoolName
12 {
get;
set; }
13
14 [DataMember]
15 public int?
Status
16 {
get;
set; }
17
18 public GetPeopleInfo_ConditionDto()
19 {
20 }
21 }
22 }
View Code
1.4.4.3 生成的结果类:
1 using System;
2 using System.Linq;
3 using System.Data;
4 using System.Collections.Generic;
5
6 namespace xxx
7 {
8 public class PeopleInfo
9 {
10 public DateTime?
CreateTime
11 {
get;
set; }
12
13 public int Id
14 {
get;
set; }
15
16 public string Name
17 {
get;
set; }
18
19 public int?
SchoolId
20 {
get;
set; }
21
22 public int?
Status
23 {
get;
set; }
24
25 public DateTime?
UpdateTime
26 {
get;
set; }
27
28 public int?
UserId
29 {
get;
set; }
30
31 public string SchoolName
//来自表 School
32 {
get;
set; }
33
34 public string UserEmail
//来自表 C_Users
35 {
get;
set; }
36
37 }
38 }
View Code
1.4.4.4 生成的EF代码(多表关联不再需要规约):
1 public List<PeopleInfo>
GetPeopleInfo( GetPeopleInfo_Condition condition )
2 {
3 using (
var unitOfWork =
UnitOfWorkFactory.Create(DbOption.OA))
4 {
5 var p_q = ctx.Set<People>
().AsQueryable();
6 if(condition.Status !=
null )
7 {
8 p_q = p_q.Where(x=>x.Status ==
condition.Status);
9 }
10
11 var s_q = ctx.Set<School>
().AsQueryable();
12 if(condition.SchoolName !=
null )
13 {
14 s_q = s_q.Where(x=>x.Name ==
condition.SchoolName);
15 }
16
17 var u_q = ctx.Set<User>
().AsQueryable();
18 var q =
p_q;
19
20 var q_1 = q.GroupJoin(s_q,p=>p.SchoolId,s=>
s.Id,
21 (p,s)=>
new { p,s =
s.DefaultIfEmpty() })
22 .SelectMany(item=>item.s.Select(s=>
new {item.p,s}));
23
24 var q_2 = q_1.GroupJoin(u_q,p=>p.p.UserId,u=>
u.UserId,
25 (p,u)=>
new { p,u =
u.DefaultIfEmpty() })
26 .SelectMany(item=>item.u.Select(u=>
new {item.p.p,item.p.s,u}));
27
28 var q_final = q_2.Where(x=>
29 true);
30
31 var list = q_final.Select(x=>
new PeopleInfo(){
32 SchoolId =
x.p.SchoolId,
33 Name =
x.p.Name,
34 CreateTime =
x.p.CreateTime,
35 UpdateTime =
x.p.UpdateTime,
36 Id =
x.p.Id,
37 Status =
x.p.Status,
38 UserId =
x.p.UserId,
39 SchoolName =
x.SchoolName,
40 UserEmail =
x.UserEmail,
41 });
42 return list.ToList();
43 }
44 }
View Code
1.4.5 高级查询
1.4.5.1 分组查询
1.4.5.2 选项查询
1.4.5.2.1 {'op','all'} 一个字段产生多个查询条件
1.4.5.2.2 对条件查询进行条件:在某些参数非空下区域内参数才有效
写这么多,感觉需要控制篇幅,查询告一段落~
1.5 反向工程(持久阶段元数据更新设计阶段元数据)
使设计永不过期
----------->
1.6 生成数据词典
----------->
终于码完了。
2. 总结:
生成器基本上涉及了数据系统资源管理的方方面面(数据操作,应用层,服务层,展现层),能节约大量的开发时间。使工程师更注重业务知识,
举例来说,用来这套开发工具后,我们团队加班变得非常少,项目进度和预期的基本吻合。拙笔仓促,如有笔误和不妥请谅解,希望听到大家的意见和建议,thanks。
转载于:https://www.cnblogs.com/yoyoma/p/CodeGenerator.html
相关资源:JAVA上百实例源码以及开源项目