У меня самого отношения любви и ненависти к классам LINQ to SQL, но я подумал, что буду играть в адвоката дьявола :-), во-первых, обращая внимание на то, что вы сделали: -
1º Я кодирую свой бизнес-уровень, графический интерфейс и т. д., а позже таблица Accounts в базе данных изменяется (например, изменение имени одного столбца), затем мне нужно перестроить «LINQ to SQL Classes» и все мои слои кода необходимо будет перекодировать, потому что мой объект «Учетная запись» изменился.
Общий подход заключается в том, что вы добавляете поведение к разделяемым классам, сгенерированным LINQ to SQL, эти файлы не будут заменены при обновлении таблицы из контекста данных. Если вы измените имя столбца и не хотите менять остальную часть кода, просто обновите класс в конструкторе, чтобы использовать старое имя столбца?
Даже если вы использовали POCO для сохранения, например, с NHibernate, вам все равно нужно изменить сопоставление, поэтому я не вижу в этом проблемы.
2º Если мне нужно иметь другие репозитории (MySQL, Oracle, XML и другие), какой класс «Учетная запись» я буду использовать?
Лично я бы назвал YAGNI в этом вопросе, если вы действительно ожидаете, что вам понадобится поддержка нескольких баз данных, LINQ to SQL может быть не лучшим решением для начала в любом случае (просто чтобы ваша инфраструктура была согласованной во всем приложении), такие инструменты, как NHibernate, имеют гораздо лучшую поддержку для таких ситуаций.
Переходя к добавлению пользовательского класса учетной записи, о коде сопоставления можно позаботиться с помощью таких инструментов, как AutoMapper, хотя это может означать, что вы отказываетесь от таких вещей, как отложенная загрузка (что может иметь или не иметь для вас большого значения).
В конце концов, полный контроль над вашими сущностями может быть очень полезным (например, отсутствие необходимости использовать конструктор без параметров, контроль над созданием и т. д., простые пользовательские типы, которые сопоставляются с одним или двумя столбцами), и если вы чувствуете, что ваше приложение может выиграть из этого, вероятно, следует идти, но вы заплатите цену за реализацию репозитория, которая будет усложнена сопоставлением кода и обработкой необходимости обновления/удаления/вставки.
Хорошей промежуточной точкой может быть простое кодирование интерфейса (например, IAccount), это должно определять свойства и метод, которые вы ожидаете от учетной записи. Тогда ваш репозиторий станет
IAccount GetById(int accountId);
Затем вы дадите себе свободу выбора реализации (т. е. реализована ли она классом LINQ to SQL или проекцией/отображением), и если вы выберете собственный класс в будущем, это будет простой случай перемещения реализацию этого класса и изменение реализации репозитория.
В конце концов, все зависит от приложения, если вы думаете, что оно в конечном итоге превратится в огромное приложение с чрезвычайно сложной бизнес-логикой, я бы выбрал слой сегрегированного домена, который, по крайней мере, пытается быть неосведомленным о постоянстве. Если, однако, это не так, то выбор шаблона репозитория — это просто средство для достижения хорошей тестируемости и простой абстракции над вашим доступом к данным. Я не понимаю, почему явная ссылка на классы LINQ to SQL и их использование в качестве простого уровня предметной области — это такая большая проблема.
person
John Foster
schedule
02.09.2009