|
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.
|