Mercurial > pub > bltoolkit
comparison HowTo/Reflection/ObjectFactory.cs @ 0:f990fcb411a9
Копия текущей версии из github
author | cin |
---|---|
date | Thu, 27 Mar 2014 21:46:09 +0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:f990fcb411a9 |
---|---|
1 using System; | |
2 using System.Collections.Generic; | |
3 | |
4 using NUnit.Framework; | |
5 | |
6 using BLToolkit.Data; | |
7 using BLToolkit.Mapping; | |
8 using BLToolkit.Reflection; | |
9 | |
10 namespace HowTo.Reflection | |
11 { | |
12 [TestFixture] | |
13 public class ObjectFactoryTest | |
14 { | |
15 /*[a]*/[ObjectFactory(typeof(Person.ObjectFactory))]/*[/a]*/ | |
16 public class Person | |
17 { | |
18 [MapField("PersonID")] | |
19 public int ID; | |
20 | |
21 public string LastName; | |
22 public string FirstName; | |
23 public string MiddleName; | |
24 | |
25 /*[a]*/class ObjectFactory : IObjectFactory/*[/a]*/ | |
26 { | |
27 public object /*[a]*/CreateInstance(TypeAccessor typeAccessor, InitContext context)/*[/a]*/ | |
28 { | |
29 // Get the object type indicator field. | |
30 // | |
31 object objectType = context.DataSource.GetValue(context.SourceObject, "PersonType"); | |
32 | |
33 // Target ObjectMapper must be changed in order to provide correct mapping. | |
34 // | |
35 switch ((string)objectType) | |
36 { | |
37 case "D": /*[a]*/context.ObjectMapper = ObjectMapper<Doctor>. Instance;/*[/a]*/ break; | |
38 case "P": /*[a]*/context.ObjectMapper = ObjectMapper<Patient>.Instance;/*[/a]*/ break; | |
39 } | |
40 | |
41 // Create an object instance. | |
42 // Do not call ObjectMapper.CreateInstance as it will lead to infinite recursion. | |
43 // | |
44 return context.ObjectMapper./*[a]*/TypeAccessor/*[/a]*/.CreateInstance(context); | |
45 } | |
46 } | |
47 } | |
48 | |
49 public class /*[a]*/Doctor : Person/*[/a]*/ | |
50 { | |
51 public string Taxonomy; | |
52 } | |
53 | |
54 public class /*[a]*/Patient : Person/*[/a]*/ | |
55 { | |
56 public string Diagnosis; | |
57 } | |
58 | |
59 [Test] | |
60 public void Test() | |
61 { | |
62 using (DbManager db = new DbManager()) | |
63 { | |
64 List<Person> list = db | |
65 .SetCommand(@" | |
66 SELECT | |
67 ps.*, | |
68 d.Taxonomy, | |
69 p.Diagnosis, | |
70 CASE | |
71 WHEN d.PersonID IS NOT NULL THEN 'D' | |
72 WHEN p.PersonID IS NOT NULL THEN 'P' | |
73 END as PersonType | |
74 FROM | |
75 Person ps | |
76 LEFT JOIN Doctor d ON d.PersonID = ps.PersonID | |
77 LEFT JOIN Patient p ON p.PersonID = ps.PersonID | |
78 ORDER BY | |
79 ps.PersonID") | |
80 .ExecuteList<Person>(); | |
81 | |
82 Assert.AreEqual(list[0].GetType(), /*[a]*/typeof(Doctor)/*[/a]*/); | |
83 Assert.AreEqual(list[1].GetType(), /*[a]*/typeof(Patient)/*[/a]*/); | |
84 | |
85 if (list.Count > 2) | |
86 Assert.AreEqual(list[2].GetType(), typeof(Person)); | |
87 } | |
88 } | |
89 } | |
90 } |