⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 componententitymodetotuplizermapping.cs

📁 NHibernate NET开发者所需的
💻 CS
字号:
using System;
using System.Collections.Generic;
using NHibernate.Mapping;
using NHibernate.Util;

namespace NHibernate.Tuple.Component
{
	/// <summary> 
	/// Handles mapping <see cref="EntityMode"/>s to <see cref="IComponentTuplizer">ComponentTuplizers</see>.
	/// <p/>
	/// Most of the handling is really in the super class; here we just create
	/// the tuplizers and add them to the superclass
	/// </summary>
	[Serializable]
	public class ComponentEntityModeToTuplizerMapping : EntityModeToTuplizerMapping
	{
		private static readonly System.Type[] componentTuplizerCTORSignature = new System.Type[] { typeof(Mapping.Component) };

		public ComponentEntityModeToTuplizerMapping(Mapping.Component component)
		{
			PersistentClass owner = component.Owner;

			// create our own copy of the user-supplied tuplizer impl map
			Dictionary<EntityMode, string> userSuppliedTuplizerImpls;
			if (component.TuplizerMap != null)
				userSuppliedTuplizerImpls = new Dictionary<EntityMode, string>(component.TuplizerMap);
			else
				userSuppliedTuplizerImpls = new Dictionary<EntityMode, string>();

			// Build the dynamic-map tuplizer...
			ITuplizer dynamicMapTuplizer;
			string tuplizerImpl;
			if (!userSuppliedTuplizerImpls.TryGetValue(EntityMode.Map,out tuplizerImpl))
			{
				dynamicMapTuplizer = new DynamicMapComponentTuplizer(component);
			}
			else
			{
				dynamicMapTuplizer = BuildComponentTuplizer(tuplizerImpl, component);
				userSuppliedTuplizerImpls.Remove(EntityMode.Map);
			}

			// then the pojo tuplizer, using the dynamic-map tuplizer if no pojo representation is available
			ITuplizer pojoTuplizer;
			string tempObject2;
			userSuppliedTuplizerImpls.TryGetValue(EntityMode.Poco, out tempObject2);
			userSuppliedTuplizerImpls.Remove(EntityMode.Poco);
			tuplizerImpl = tempObject2;
			if (owner.HasPocoRepresentation && component.HasPocoRepresentation)
			{
				if (tuplizerImpl == null)
				{
					pojoTuplizer = new PocoComponentTuplizer(component);
				}
				else
				{
					pojoTuplizer = BuildComponentTuplizer(tuplizerImpl, component);
				}
			}
			else
			{
				pojoTuplizer = dynamicMapTuplizer;
			}

			// put the "standard" tuplizers into the tuplizer map first
			if (pojoTuplizer != null)
			{
				AddTuplizer(EntityMode.Poco, pojoTuplizer);
			}
			if (dynamicMapTuplizer != null)
			{
				AddTuplizer(EntityMode.Map, dynamicMapTuplizer);
			}

			// then handle any user-defined entity modes..
			foreach (KeyValuePair<EntityMode, string> entry in userSuppliedTuplizerImpls)
			{
				IComponentTuplizer tuplizer = BuildComponentTuplizer(entry.Value, component);
				AddTuplizer(entry.Key, tuplizer);
			}
		}

		private IComponentTuplizer BuildComponentTuplizer(string tuplizerImpl, Mapping.Component component)
		{
			try
			{
				System.Type implClass = ReflectHelper.ClassForName(tuplizerImpl);
				return (IComponentTuplizer)implClass.GetConstructor(componentTuplizerCTORSignature).Invoke(new object[] { component });
			}
			catch (Exception t)
			{
				throw new HibernateException("Could not build tuplizer [" + tuplizerImpl + "]", t);
			}
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -