Присоединение объектов к контексту EF без их загрузки и без ущерба для DDD.C#

Место общения программистов C#
Anonymous
Присоединение объектов к контексту EF без их загрузки и без ущерба для DDD.

Сообщение Anonymous »

В DDD принято защищать свойства объекта следующим образом:

Код: Выделить всё

public class Customer
{
private Customer() { }
public Customer(int id, string name) { /* ...populate properties... */ }
public int Id { get; private set; }
public string Name { get; private set; }
// and so on...
}
EF использует отражение, поэтому он может обрабатывать все эти частные данные.

Но что, если вам нужно присоединить объект, не загружая его (очень распространенная вещь):

Код: Выделить всё

var customer = new Customer { Id = getIdFromSomewhere() };       // can't do this!
myContext.Set().Attach(customer);
Это не сработает, поскольку установщик идентификатора является частным.

Как можно справиться с этим несоответствием между языком и DDD?

Идеи:
  • сделать идентификатор общедоступным (и сломать DDD)
  • создать конструктор/метод для заполнения фиктивного объекта (не имеет смысла)
  • использовать отражение («чит»)
  • ???
Я думаю, что лучший компромисс - использовать отражение и установить это свойство Private Id, как это делает EF. Да, это рефлексия и медленная, но гораздо быстрее, чем загрузка из базы данных. И да, это обман, но, по крайней мере, что касается домена, официально невозможно создать экземпляр этого объекта без использования конструктора.

Как вы справляетесь с этим сценарием?



PS Я провел простой тест, и создание миллиона экземпляров с использованием отражения занимает около 10 секунд. Таким образом, по сравнению с обращением к базе данных или отражением, выполняемым EF, дополнительные накладные расходы незначительны.

Подробнее здесь: https://stackoverflow.com/questions/440 ... ficing-ddd

Вернуться в «C#»