После небольшого копания я нашел решение. Существует интерфейс IReferenceConvention, который, как я видел, использовался в других примерах, но не охватывает этот сценарий. Благодаря реализации интерфейса и выполнению пользовательского соглашения я смог добиться того же с AutoPersistenceModel, что и с ClassMap.
public class ReferenceConvention : IReferenceConvention
{
public void Apply(IManyToOneInstance instance)
{
Type instanceType = instance.Class.GetUnderlyingSystemType();
if (instanceType == typeof(IFoo))
{
instance.CustomClass<Foo>();
}
instance.Cascade.All();
}
}
Более общий подход может быть:
public class ReferenceConvention : IReferenceConvention
{
public void Apply(IManyToOneInstance instance)
{
Type instanceType = instance.Class.GetUnderlyingSystemType();
if (instanceType.IsInterface)
{
// Assuming that the type starts with an I get the name of the concrete class
string className = instanceType.Name.Substring( 1 );
instance.CustomClass(instanceType.Assembly.GetType(
instanceType.FullName.Replace( instanceType.Name, className )));
}
instance.Cascade.All();
}
}
Существует также ReferenceConventionBuilder, который я еще не рассматривал, но это может быть более чистым решением.