Мы следуем принципам доменного дизайна в нашей модели, комбинируя данные и поведение в классах объектов и объектов-значений. Нам часто приходится настраивать поведение наших клиентов. Вот простой пример, когда клиент хочет изменить форматирование FullName:
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
// Standard format is Last, First
public virtual string FullName => $"{LastName}, {FirstName}";
}
public class PersonCustom : Person
{
// Customer wants to see First Last instead
public override string FullName => $"{FirstName} {LastName}";
}
DbSet настроен на DbContext, как и следовало ожидать:
public virtual DbSet<Person> People { get; set; }
Во время выполнения класс PersonCustom должен быть создан вместо класса Person. Это не проблема, когда наш код отвечает за создание экземпляра сущности, например, при добавлении нового человека. Контейнер / фабрика IoC можно настроить для замены класса PersonCustom на класс Person. Однако при запросе данных EF отвечает за создание экземпляра объекта. При запросе context.People, есть ли способ настроить или перехватить создание сущности для замены PersonCustom на класс Person во время выполнения?
Я использовал вышеописанное наследование, но вместо этого мог бы реализовать интерфейс IPerson, если это имеет значение. В любом случае, вы можете предположить, что интерфейс будет одинаковым в обоих классах.
Редактировать: Немного больше информации о том, как это развернуто ... Класс Person будет частью стандартной сборки, которая предоставляется всем клиентам. PersonCustom перейдет в отдельную пользовательскую сборку, которая предоставляется только заказчику, который хочет внести изменения, поэтому они получат стандартную сборку плюс пользовательскую сборку. Мы не будем создавать отдельную сборку всего проекта, чтобы приспособить настройку.