Игнорировать все сумасшедшие ответы о поточно-ориентированных и т. Д., Которые не имеют никакого отношения к DDD.
(Я еще не видел потокобезопасного маппера O / R или другого dal-дружественного dal)
Представьте себе объект значения для весов.
скажем, у нас есть объект значения KG.
образец (отредактированный для ясности):
var kg75 = new Weight(75);
joe.Weight = kg75;
jimmy.Weight = kg75;
Теперь, что произойдет, если мы сделаем:
jimmy.Weight.Value = 82;
Это также изменило бы вес Джо, если бы мы все еще использовали те же ссылки на объекты, что и.
Обратите внимание, что мы присвоили объект, представляющий 75 кг, как Джо, так и Джимми.
Когда Джимми набирает вес, изменился не объект kg75, а вес Джимми, поэтому мы должны создать новый объект, представляющий 82 кг.
Но что, если у нас будет новый сеанс и мы загрузим Джо и Джимми в чистую UoW?
var joe = context.People.Where(p => p.Name = "joe").First();
var jimmy = context.People.Where(p => p.Name = "jimmy").First();
jimmy.Weight.Value = 82;
Что тогда будет? хорошо, так как EF4 в вашем случае будет загружать Джо и Джимми и их веса без какой-либо идентичности, мы получим два разных объекта веса, и когда мы изменим вес Джиммиса, Джо все равно будет весить так же, как и раньше.
Таким образом, у нас было бы два разных поведения для одного и того же кода.
Если ссылки на объекты остаются прежними, то и Джо, и Джимми получили бы новый вес.
Если Джо и Джимми загружены в чистом виде, изменения коснутся только одного из них.
И это было бы совершенно бесцеремонным ИМО.
Используя неизменяемые VO, вы получите одинаковое поведение в обоих случаях, и вы все равно сможете повторно использовать ссылки на объекты для меньшего объема памяти при построении графов объектов.