在MDriven中,我想在运行时获取建模类的类型鉴别符。我以为我以前做过,但似乎找不到并无法解决。
我的意思是首先在外部ID字符串中出现的整数,例如外部ID“ 72!i64!12345678”中的“ 72”。
我需要基于C#类型(即typeof(MyClass))的鉴别器,而没有任何可用的对象实例。这使得不可能从外部id字符串中提取区分符,因为我当时没有这样的字符串,并且无法创建一个。
我正在使用,Eco.Services.Impl.ExternalIdServiceImpl_DbType
因此外部ID的类型标识符与数据库中的类型标识符匹配,以防万一。但是,如何在运行时查找类型的鉴别符?
找到源代码后,Eco.Services.Impl.ExternalIdServiceImpl_DbType
我便可以创建此解决方案:
public static string GetClassDiscriminator<T>(this IEcoServiceProvider sp)
{
IEcoTypeSystem typeSys = sp.GetEcoService<ITypeSystemService>().TypeSystem;
IClass cls = typeSys.AllClasses.Cast<IClass>().First(c => c.ObjectType == typeof(T));
if (sp.GetEcoService<IExternalIdService>() is Eco.Services.Impl.ExternalIdServiceImpl_DbType)
{
ORMappingDefinition mapping = ((PersistenceMapperDb)DiamondsPMP.Instance.PersistenceMapper).EffectiveRunTimeMappingProvider.Mapping;
if (mapping == null)
throw new InvalidOperationException(PersistenceStringRes.MappingProviderNotInitialized);
ClassDefinition classdef = mapping.Classes[typeSys.AllClasses[0].Name];
if (classdef.Discriminators.Count == 0)
throw new InvalidOperationException(PersistenceStringRes.RootclassHasNoDiscriminatorDefined);
DiscriminatorDef discriminator = classdef.Discriminators.Cast<DiscriminatorDef>().First();
DiscriminatorValue discvalue = discriminator.DiscriminatorValuesByClassId(cls.InternalIndex);
if (discvalue == null)
throw new InvalidOperationException(PersistenceStringRes.ClassHasNoDiscriminatorValueDefined);
if (discvalue.IsFinal && cls.SubTypes.Count > 0)
throw new InvalidOperationException(PersistenceStringRes.DiscriminatorIsFinal);
return discvalue.Value;
}
else
return cls.InternalIndex.ToString();
}
sp.GetEcoService<IExternalIdService>() is Eco.Services.Impl.ExternalIdServiceImpl_DbType
在我的情况下,这是必需的,因为在我的单元测试中,我使用PersistenceMapperMemory
,该索引将inTypeSystem.AllClasses
用作区分类型,这也是所返回的值IClass.InternalIndex
。
我也注意到那IExternalIdService.ObjectForIdSeperateClassInfo()
是越野车。它就像Eco.Services.Impl.ExternalIdServiceImpl
正在使用一样,返回IObjectInstance
错误的类型(使用中的类的索引TypeSystem.AllClasses
)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句