From: <fab...@us...> - 2009-07-19 22:23:05
|
Revision: 4656 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4656&view=rev Author: fabiomaulo Date: 2009-07-19 22:22:59 +0000 (Sun, 19 Jul 2009) Log Message: ----------- TypeDefinition configuration by code Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Cfg/Loquacious/ConfigurationExtensions.cs trunk/nhibernate/src/NHibernate/NHibernate.csproj trunk/nhibernate/src/NHibernate/Util/ReflectHelper.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate/Cfg/Loquacious/ITypeDefConfiguration.cs trunk/nhibernate/src/NHibernate.Test/CfgTest/Loquacious/TypeDefinitionFixture.cs Modified: trunk/nhibernate/src/NHibernate/Cfg/Loquacious/ConfigurationExtensions.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/Loquacious/ConfigurationExtensions.cs 2009-07-19 12:35:19 UTC (rev 4655) +++ trunk/nhibernate/src/NHibernate/Cfg/Loquacious/ConfigurationExtensions.cs 2009-07-19 22:22:59 UTC (rev 4656) @@ -1,5 +1,6 @@ using System; using NHibernate.Hql; +using NHibernate.Util; namespace NHibernate.Cfg.Loquacious { @@ -60,16 +61,70 @@ entityCacheConfiguration(ecc); if (ecc.Strategy.HasValue) { - configuration.SetCacheConcurrencyStrategy(typeof (TEntity).FullName, EntityCacheUsageParser.ToString(ecc.Strategy.Value), - ecc.RegionName); + configuration.SetCacheConcurrencyStrategy(typeof(TEntity).FullName, EntityCacheUsageParser.ToString(ecc.Strategy.Value), + ecc.RegionName); } foreach (var collection in ecc.Collections) { configuration.SetCollectionCacheConcurrencyStrategy(collection.Key, - EntityCacheUsageParser.ToString(collection.Value.Strategy), - collection.Value.RegionName); + EntityCacheUsageParser.ToString(collection.Value.Strategy), + collection.Value.RegionName); } return configuration; } + + /// <summary> + /// Add a type-definition for mappings. + /// </summary> + /// <typeparam name="TDef">The peristent type.</typeparam> + /// <param name="configuration">The <see cref="Configuration"/> where add the type-definition.</param> + /// <param name="typeDefConfiguration">The custom configuration action.</param> + /// <returns>The <see cref="Configuration"/>.</returns> + /// <remarks> + /// <para> + /// <list type="bullet"> + /// <listheader> + /// <description>Depending on where you will use the type-definition in the mapping the + /// <typeparamref name="TDef"/> can be : + /// </description> + ///</listheader> + ///<item> + /// <term><see cref="NHibernate.UserTypes.IUserType"/></term> + ///</item> + ///<item> + /// <term><see cref="NHibernate.UserTypes.IUserCollectionType"/></term> + ///</item> + ///<item> + /// <term><see cref="NHibernate.UserTypes.IUserVersionType"/></term> + ///</item> + ///<item> + /// <term><see cref="NHibernate.Id.IPersistentIdentifierGenerator"/> </term> + ///</item> + ///</list> + /// </para> + /// </remarks> + public static Configuration TypeDefinition<TDef>(this Configuration configuration, Action<ITypeDefConfigurationProperties> typeDefConfiguration) + where TDef : class + { + if (typeDefConfiguration == null) + { + return configuration; + } + var tdConfiguration = new TypeDefConfigurationProperties<TDef>(); + typeDefConfiguration(tdConfiguration); + if(string.IsNullOrEmpty(tdConfiguration.Alias)) + { + return configuration; + } + var mappings = GetMappings(configuration); + mappings.AddTypeDef(tdConfiguration.Alias, typeof(TDef).AssemblyQualifiedName, tdConfiguration.Properties.ToTypeParameters()); + return configuration; + } + + private static Mappings GetMappings(Configuration configuration) + { + Dialect.Dialect dialect = Dialect.Dialect.GetDialect(configuration.Properties); + return configuration.CreateMappings(dialect); + } } } \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Cfg/Loquacious/ITypeDefConfiguration.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Cfg/Loquacious/ITypeDefConfiguration.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Cfg/Loquacious/ITypeDefConfiguration.cs 2009-07-19 22:22:59 UTC (rev 4656) @@ -0,0 +1,48 @@ +namespace NHibernate.Cfg.Loquacious +{ + /// <summary> + /// Properties of TypeDef configuration. + /// </summary> + /// <seealso cref="ConfigurationExtensions.TypeDefinition{TDef}<>"/> + public interface ITypeDefConfigurationProperties + { + /// <summary> + /// The key to use the type-definition inside not strongly typed mappings (XML mapping). + /// </summary> + string Alias { get; set; } + + /// <summary> + /// An <see cref="object"/> which public properties are used as + /// type-definition pareneters or null where type-definition does not need parameters or you want use default values. + /// </summary> + /// <remarks> + /// <example> + /// As <paramref name="value"/> an anonimous object can be used: + /// <code> + /// configure.TypeDefinition<TableHiLoGenerator>(c=> + /// { + /// c.Alias = "HighLow"; + /// c.Properties = new {max_lo = 99}; + /// }); + /// </code> + /// </example> + /// </remarks> + object Properties { get; set; } + } + + internal class TypeDefConfigurationProperties<T> : ITypeDefConfigurationProperties + where T: class + { + public TypeDefConfigurationProperties() + { + Alias = typeof(T).Name; + } + + #region Implementation of ITypeDefConfigurationProperties + + public string Alias { get; set; } + public object Properties { get; set; } + + #endregion + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-07-19 12:35:19 UTC (rev 4655) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-07-19 22:22:59 UTC (rev 4656) @@ -479,6 +479,7 @@ <Compile Include="Cfg\Loquacious\IProxyConfiguration.cs" /> <Compile Include="Cfg\Loquacious\IQueryCacheConfiguration.cs" /> <Compile Include="Cfg\Loquacious\ITransactionConfiguration.cs" /> + <Compile Include="Cfg\Loquacious\ITypeDefConfiguration.cs" /> <Compile Include="Cfg\Loquacious\MappingsConfiguration.cs" /> <Compile Include="Cfg\Loquacious\ProxyConfiguration.cs" /> <Compile Include="Cfg\SchemaAutoAction.cs" /> Modified: trunk/nhibernate/src/NHibernate/Util/ReflectHelper.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Util/ReflectHelper.cs 2009-07-19 12:35:19 UTC (rev 4655) +++ trunk/nhibernate/src/NHibernate/Util/ReflectHelper.cs 2009-07-19 22:22:59 UTC (rev 4656) @@ -594,5 +594,28 @@ } return result; } + + public static IDictionary<string,string> ToTypeParameters(this object source) + { + if(source == null) + { + return new Dictionary<string, string>(1); + } + var props = source.GetType().GetProperties(); + if(props.Length == 0) + { + return new Dictionary<string, string>(1); + } + var result = new Dictionary<string, string>(props.Length); + foreach (var prop in props) + { + var value = prop.GetValue(source, null); + if (!ReferenceEquals(null, value)) + { + result[prop.Name] = value.ToString(); + } + } + return result; + } } } Added: trunk/nhibernate/src/NHibernate.Test/CfgTest/Loquacious/TypeDefinitionFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/CfgTest/Loquacious/TypeDefinitionFixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/CfgTest/Loquacious/TypeDefinitionFixture.cs 2009-07-19 22:22:59 UTC (rev 4656) @@ -0,0 +1,28 @@ +using NHibernate.Cfg; +using NHibernate.Cfg.Loquacious; +using NHibernate.Dialect; +using NHibernate.Id; +using NUnit.Framework; + +namespace NHibernate.Test.CfgTest.Loquacious +{ + [TestFixture] + public class TypeDefinitionFixture + { + [Test] + public void AddTypeDef() + { + var configure = new Configuration() + .DataBaseIntegration(db => db.Dialect<MsSql2005Dialect>()); + configure.TypeDefinition<TableHiLoGenerator>(c=> + { + c.Alias = "HighLow"; + c.Properties = new {max_lo = 99}; + }); + var mappings = configure.CreateMappings(Dialect.Dialect.GetDialect(configure.Properties)); + var typeDef = mappings.GetTypeDef("HighLow"); + Assert.That(typeDef, Is.Not.Null); + Assert.That(typeDef.Parameters["max_lo"], Is.EqualTo("99")); + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-07-19 12:35:19 UTC (rev 4655) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-07-19 22:22:59 UTC (rev 4656) @@ -112,6 +112,7 @@ <Compile Include="CfgTest\Loquacious\EntityCacheConfigurationFixture.cs" /> <Compile Include="CfgTest\Loquacious\EntityToCache.cs" /> <Compile Include="CfgTest\Loquacious\LambdaConfigurationFixture.cs" /> + <Compile Include="CfgTest\Loquacious\TypeDefinitionFixture.cs" /> <Compile Include="CfgTest\MappingDocumentAggregatorTests.cs" /> <Compile Include="CfgTest\MappingDocumentParserTests.cs" /> <Compile Include="CfgTest\SchemaAutoActionFixture.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |