Вот мое мнение:
При работе с любым нетривиальным приложением. Использование ваших объектов linq2Sql в качестве модели вашего домена - очень плохая идея. Я вижу linq2Sql как ORM и ничего более. Базы данных (которым linq2Sql имеет прямое соответствие) - это нормализация data . Классы (в смысле OOAD) являются нормализацией поведения (не данных).
[эти объекты класса являются зеркальным отражением] ...
Я сталкивался с этим при создании приложений с помощью linq2Sql. Давайте будем реалистами ... большинство бизнес-приложений - это прославленные CRUD-приложения. Поэтому не исключено, что большой процент объектов вашего приложения будет напрямую соответствовать таблицам базы данных. Я не хотел связываться напрямую с генерируемыми DTO, но в то же время я не хотел, чтобы дубликаты классов были засорены в моем приложении.
Так вот мое решение:
Я "запрограммирован на интерфейс".
Допустим, у меня есть PersonDto
(Dto означает объект передачи данных) со свойствами FirstName, LastName, Age
(которые имеют непосредственное отношение к столбцам базы данных).
Я создал IPerson
интерфейс, и мой PersonD реализовал его.
[Table(Name="Persons")]
internal class PersonDto : IPerson
{
....
}
И мой метод репозитория будет принимать и извлекать IPerson
в отличие от класса Linq2Sql.
IPerson somePerson = _repository.Get(someGuid);
somePerson.FirstName = "SomeName";
_repository.Save(somePerson);
Этот подход очень хорошо сработал для меня. Всякий раз, когда я чувствую, что мне нужно отклониться от DTO, я могу сделать это довольно легко благодаря интерфейсу, представляющему мой объект, а не DTO.
Некоторые общие указатели:
Создайте свой DTO вручную ... Я знаю, это звучит безумно, но вы обнаружите, что он действительно хорошо работает с подходом к разработке сверху вниз. Ваши объекты DTO (linq2Sql) будут чрезвычайно легкими и будут открыты для изменений за пределами конструктора .dbml.
Храните ваши DTO и DataContext внутри. Нет причин для публичного представления ваших dto (учитывая, что у вас есть открытые интерфейсы для ваших репозиториев и доменных объектов). Это приведет к логическому разделению между моделью вашего домена и доступом к данным.
Поместите все уровни доступа к данным в отдельный проект (снова, чтобы обеспечить это разделение).
Поместите объявления интерфейса в отдельный проект (это гарантирует, что вы не встретите никаких циклических ссылок).
Надеюсь, это поможет ...