在找到源代码后,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
,它使用索引TypeSystem.AllClasses
作为类型鉴别器,这也是返回的值IClass.InternalIndex
。
我还注意到这IExternalIdService.ObjectForIdSeperateClassInfo()
是错误的。它就像Eco.Services.Impl.ExternalIdServiceImpl
正在使用一样,返回一个IObjectInstance
错误类型(使用类的索引TypeSystem.AllClasses
)。