Mercurial > pub > bltoolkit
diff Source/Mapping/Fluent/FluentConfig.cs @ 0:f990fcb411a9
Копия текущей версии из github
author | cin |
---|---|
date | Thu, 27 Mar 2014 21:46:09 +0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Source/Mapping/Fluent/FluentConfig.cs Thu Mar 27 21:46:09 2014 +0400 @@ -0,0 +1,133 @@ +using System; +using System.CodeDom; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; + +using BLToolkit.Data; +using BLToolkit.Data.DataProvider; +using BLToolkit.Reflection.Extension; + +namespace BLToolkit.Mapping.Fluent +{ + /// <summary> + /// Configure BLToolkit in fluent style + /// </summary> + public static class FluentConfig + { + private static Dictionary<Assembly, ExtensionList> _hash = new Dictionary<Assembly, ExtensionList>(); + + /// <summary> + /// Configure DbManager + /// </summary> + /// <param name="dbManager"></param> + public static MappingConfigurator Configure(DbManager dbManager) + { + MappingSchema mappingSchema = dbManager.MappingSchema ?? (dbManager.MappingSchema = Map.DefaultSchema); + return Configure(mappingSchema); + } + + /// <summary> + /// Configure DataProvider + /// </summary> + /// <param name="dataProvider"></param> + public static MappingConfigurator Configure(DataProviderBase dataProvider) + { + MappingSchema mappingSchema = dataProvider.MappingSchema ?? (dataProvider.MappingSchema = Map.DefaultSchema); + return Configure(mappingSchema); + } + + /// <summary> + /// Configure MappingSchema + /// </summary> + /// <param name="mappingSchema"></param> + public static MappingConfigurator Configure(MappingSchema mappingSchema) + { + ExtensionList extensionList = mappingSchema.Extensions ?? (mappingSchema.Extensions = new ExtensionList()); + return Configure(extensionList); + } + + /// <summary> + /// Configure ExtensionList + /// </summary> + /// <param name="extensionList"></param> + public static MappingConfigurator Configure(ExtensionList extensionList) + { + return new MappingConfigurator(extensionList); + } + + public class MappingConfigurator + { + private ExtensionList _extensions; + + public MappingConfigurator(ExtensionList extensions) + { + this._extensions = extensions; + } + + /// <summary> + /// Mapping IFluentMap-Type + /// </summary> + /// <typeparam name="T"></typeparam> + /// <returns></returns> + public void MapingFromType<T>() where T : IFluentMap + { + MapingFromType(typeof(T)); + } + + public void MapingFromType(Type T) + { + var res = new ExtensionList(); + var map = (IFluentMap)Activator.CreateInstance(T); + + map.MapTo(res); + + FluentMapHelper.MergeExtensions(res, ref this._extensions); + } + /// <summary> + /// Mapping from assembly contains type + /// </summary> + /// <typeparam name="T"></typeparam> + /// <returns></returns> + public void MapingFromAssemblyOf<T>() + { + this.MapingFromAssembly(typeof(T).Assembly); + } + + /// <summary> + /// Mapping from assembly + /// </summary> + /// <param name="assembly"></param> + /// <returns></returns> + public void MapingFromAssembly(Assembly assembly) + { + ExtensionList res; + if (!_hash.TryGetValue(assembly, out res)) + { + res = new ExtensionList(); + _hash.Add(assembly, res); + + string fluentType = typeof(IFluentMap).FullName; + var mapTypes = from type in assembly.GetTypes() + where type.IsClass && !type.IsAbstract && !type.IsGenericType + && (null != type.GetInterface(fluentType)) // Is IFluentMap + && (null != type.GetConstructor(new Type[0])) // Is defaut ctor + select type; + foreach (var fluentMapType in mapTypes) + { + MapingFromType(fluentMapType); + } + } + //FluentMapHelper.MergeExtensions(res, ref this._extensions); + } + + #region Conventions + + public static Func<Type, string> GetTableName; + public static Func<MappedProperty, string> GetColumnName; + //public static Func<MappedProperty, MappedProperty, string> GetManyToManyTableName; + + #endregion + } + } +} \ No newline at end of file