Присоединение объектов к контексту 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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