Просто подумал, что поделюсь тем, как мне удалось добиться этого, используя Fluent NHibernate, а не файлы hbm.
Этот метод немного хакерский, но хаки изолируются и легко удаляются, когда Fluent NH получает надлежащую поддержку для Union-Subclass.
Чтобы использовать ваш пример, контекст моего сценария таков: класс Employee находится в одном проекте со свойством AccountManager, указанным в качестве интерфейса, поскольку конкретный AccountManager находится в другом проекте, который мы не хотим создавать. зависимость от.
Сначала я создаю класс «Помощник», который выполняет большую часть сопоставления сотрудников и выглядит следующим образом.
public abstract class EmployeeMapperBase
{
protected abstract Type GetAccountManagerType();
public void DoMapping(ClassMap<Employee> classMap)
{
classMap.Id(x => x.Id);
classMap.Maps(..... etc....
classMap.References(x => x.AccountManager)
.Class(GetAccountManagerType());
}
}
Далее, в проекте с конкретным классом AccountManager я завершаю отображение:
public class EmployeeClassMap : ClassMap<Employee>
{
public EmployeeClassMap
{
new ConcreteEmployeeMapper().DoMapping(this);
}
private class ConcreteEmployeeMapper : EmployeeMapperBase
{
public override Type GetAccountManagerType()
{
return typeof(DefaultAccountManager);
}
}
}