using System;
using System.Collections;
using System.Linq;
namespace Kreta.Framework.Entities
{
///
/// Az megvalósítások ősosztálya.
///
public class EntityHandler : IEntityHandler
{
private static Hashtable m_Handlers = new Hashtable();
///
/// Létre van-e hozva az entitáshoz EntityHandler
///
public bool IsCreated { get; set; }
///
/// Létrehoz egy objektumot a
/// megadott entitáshoz.
///
/// Az entitás neve
/// Az entitáshoz tartozó objektum
public static IEntityHandler Create(Type entityType)
{
// <>
Type handlertype = null;
while (handlertype == null && entityType != typeof(Entity))
{
var entityName = EntityAttributeCache.GetEntityNameFromCache(entityType);
if (string.IsNullOrWhiteSpace(entityName))
{
throw new ArgumentNullException("entityName");
}
handlertype = m_Handlers[entityName.ToLower()] as Type;
entityType = entityType.BaseType;
}
bool isCreated = true;
if (handlertype == null)
{
isCreated = false;
handlertype = typeof(EntityHandler);
}
var entityHandler = (IEntityHandler)Activator.CreateInstance(handlertype, true);
entityHandler.IsCreated = isCreated; // van-e lefejlesztve hozzá EntityHandler
return entityHandler;
}
///
/// Inicializálja az entitás esemény kezelőket.
///
internal static void Init()
{
Hashtable handlers = new Hashtable();
var handlertypes = from assembly in AppDomain.CurrentDomain.GetAssemblies()
where SDAServer.Instance.IsAssemblyAllowed(assembly)
from type in assembly.GetTypes()
where (type.IsDefined(typeof(EntityHandlerAttribute), false)) && (typeof(IEntityHandler).IsAssignableFrom(type))
select type;
foreach (var handlertype in handlertypes)
{
foreach (EntityHandlerAttribute attribute in handlertype.GetCustomAttributes(typeof(EntityHandlerAttribute), false))
{
string name = attribute.EntityName.ToLower();
if (!handlers.ContainsKey(name))
{
handlers[name] = handlertype;
}
else
{
throw new Kreta.Framework.DataIntegrityException("Egy entitáshoz több Handler-t találtam: " + attribute.EntityName);
}
}
}
m_Handlers = handlers;
}
#region IEntityHandler
///
/// Az entitás insert művelete előtt fut le. Ha a leszármazott nem írja felül, akkor nem csinál semmit.
///
/// Az entitás
public virtual void BeforeInsert(Entity entity)
{
}
///
/// Az entitás insert művelete után fut le. Ha a leszármazott nem írja felül, akkor nem csinál semmit.
///
/// Az entitás
public virtual void AfterInsert(Entity entity)
{
}
///
/// Az entitás update művelete előtt fut le. Ha a leszármazott nem írja felül, akkor nem csinál semmit.
///
/// Az entitás
public virtual void BeforeUpdate(Entity entity)
{
}
///
/// Az entitás update művelete után fut le. Ha a leszármazott nem írja felül, akkor nem csinál semmit.
///
/// Az entitás
public virtual void AfterUpdate(Entity entity)
{
}
///
/// Az entitás delete művelete előtt fut le. Ha a leszármazott nem írja felül, akkor nem csinál semmit.
///
/// Az entitás
public virtual void BeforeDelete(Entity entity)
{
}
///
/// Az entitás delete művelete után fut le. Ha a leszármazott nem írja felül, akkor nem csinál semmit.
///
/// Az entitás
public virtual void AfterDelete(Entity entity)
{
}
#endregion
}
}