annotate Source/Mapping/Fluent/FluentConfig.cs @ 6:11b6da379593

Исправлена странная ошибка при использовании OfType<...>().Where(...)
author cin
date Mon, 05 Dec 2016 05:50:52 +0300
parents f990fcb411a9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
1 using System;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
2 using System.CodeDom;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
3 using System.Collections.Generic;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
4 using System.Linq;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
5 using System.Reflection;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
6
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
7 using BLToolkit.Data;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
8 using BLToolkit.Data.DataProvider;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
9 using BLToolkit.Reflection.Extension;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
10
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
11 namespace BLToolkit.Mapping.Fluent
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
12 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
13 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
14 /// Configure BLToolkit in fluent style
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
15 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
16 public static class FluentConfig
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
17 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
18 private static Dictionary<Assembly, ExtensionList> _hash = new Dictionary<Assembly, ExtensionList>();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
19
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
20 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
21 /// Configure DbManager
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
22 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
23 /// <param name="dbManager"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
24 public static MappingConfigurator Configure(DbManager dbManager)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
25 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
26 MappingSchema mappingSchema = dbManager.MappingSchema ?? (dbManager.MappingSchema = Map.DefaultSchema);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
27 return Configure(mappingSchema);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
28 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
29
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
30 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
31 /// Configure DataProvider
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
32 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
33 /// <param name="dataProvider"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
34 public static MappingConfigurator Configure(DataProviderBase dataProvider)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
35 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
36 MappingSchema mappingSchema = dataProvider.MappingSchema ?? (dataProvider.MappingSchema = Map.DefaultSchema);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
37 return Configure(mappingSchema);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
38 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
39
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
40 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
41 /// Configure MappingSchema
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
42 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
43 /// <param name="mappingSchema"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
44 public static MappingConfigurator Configure(MappingSchema mappingSchema)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
45 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
46 ExtensionList extensionList = mappingSchema.Extensions ?? (mappingSchema.Extensions = new ExtensionList());
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
47 return Configure(extensionList);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
48 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
49
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
50 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
51 /// Configure ExtensionList
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
52 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
53 /// <param name="extensionList"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
54 public static MappingConfigurator Configure(ExtensionList extensionList)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
55 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
56 return new MappingConfigurator(extensionList);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
57 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
58
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
59 public class MappingConfigurator
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
60 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
61 private ExtensionList _extensions;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
62
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
63 public MappingConfigurator(ExtensionList extensions)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
64 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
65 this._extensions = extensions;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
66 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
67
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
68 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
69 /// Mapping IFluentMap-Type
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
70 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
71 /// <typeparam name="T"></typeparam>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
72 /// <returns></returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
73 public void MapingFromType<T>() where T : IFluentMap
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
74 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
75 MapingFromType(typeof(T));
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
76 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
77
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
78 public void MapingFromType(Type T)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
79 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
80 var res = new ExtensionList();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
81 var map = (IFluentMap)Activator.CreateInstance(T);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
82
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
83 map.MapTo(res);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
84
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
85 FluentMapHelper.MergeExtensions(res, ref this._extensions);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
86 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
87 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
88 /// Mapping from assembly contains type
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
89 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
90 /// <typeparam name="T"></typeparam>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
91 /// <returns></returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
92 public void MapingFromAssemblyOf<T>()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
93 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
94 this.MapingFromAssembly(typeof(T).Assembly);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
95 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
96
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
97 /// <summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
98 /// Mapping from assembly
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
99 /// </summary>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
100 /// <param name="assembly"></param>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
101 /// <returns></returns>
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
102 public void MapingFromAssembly(Assembly assembly)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
103 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
104 ExtensionList res;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
105 if (!_hash.TryGetValue(assembly, out res))
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
106 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
107 res = new ExtensionList();
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
108 _hash.Add(assembly, res);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
109
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
110 string fluentType = typeof(IFluentMap).FullName;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
111 var mapTypes = from type in assembly.GetTypes()
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
112 where type.IsClass && !type.IsAbstract && !type.IsGenericType
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
113 && (null != type.GetInterface(fluentType)) // Is IFluentMap
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
114 && (null != type.GetConstructor(new Type[0])) // Is defaut ctor
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
115 select type;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
116 foreach (var fluentMapType in mapTypes)
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
117 {
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
118 MapingFromType(fluentMapType);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
119 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
120 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
121 //FluentMapHelper.MergeExtensions(res, ref this._extensions);
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
122 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
123
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
124 #region Conventions
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
125
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
126 public static Func<Type, string> GetTableName;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
127 public static Func<MappedProperty, string> GetColumnName;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
128 //public static Func<MappedProperty, MappedProperty, string> GetManyToManyTableName;
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
129
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
130 #endregion
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
131 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
132 }
f990fcb411a9 Копия текущей версии из github
cin
parents:
diff changeset
133 }