Советы относительно модификации NetTiers
Я оцениваю использование NetTiers для моего следующего проекта.
Проблема в том, что каждая таблица в моей схеме имеет поле AccountId. Я хочу, чтобы при каждом запросе к DAL требовалось, чтобы AccountId передавался и использовался в качестве фильтра в запросе.
Было бы приемлемо, если бы генерировалась дополнительная перегрузка, которая использовала этот параметр.
Я подозреваю, что эта функциональность не встроена, поэтому кто-нибудь может дать совет о том, с чего начать модификацию шаблонов, чтобы добавить его?
1 ответ
Модифицировать шаблоны NetTiers несложно, если вы знаете, как разбираться в лабиринте классов, которые он генерирует, но обычно он довольно утомителен и очень подвержен ошибкам.
Мое первое предположение состоит в том, что база данных, которую вы генерируете, либо имеет только несколько таблиц, либо денормализована - в противном случае не имеет смысла иметь столбец AccountId в каждой таблице. Если это более поздняя версия, и структура не может быть нормализована, она считает, что было бы довольно сложно изменить все встроенные свойства навигации, основанные на внешних ключах базы данных (включая DeepLoads), работающих с дополнительным фильтром AccountId.
Кроме того, вы упоминаете, что добавление перегрузок, содержащих AccountId, было бы приемлемым решением. Однако это привело бы к существующим перегрузкам NetTiers, которые не требуют параметра AccountId для любых потребителей DAL...
Во всяком случае, вот краткое изложение некоторых областей, которые вам необходимо изучить для изменения:
Чтобы убедиться, что никакие запросы не могут быть успешно выполнены без предоставления AccountId (существует множество способов обойти DAL по умолчанию через
GetPaged @where
например), вам, вероятно, придется вносить изменения на уровне SQL. Эти шаблоны расположены в/DataAccessLayer.*Client/
папки. Предполагая, что вы используете сервер SQL, файл, который генерирует Sql (/DataAccessLayer.SqlClient/
StoredProcedureProvider.cst
) можно изменить, чтобы всегда передавать параметр @AccountId.Это приведет к изменениям в связанных файлах, таких как
/DataAccessLayer.SqlClient/SqlEntityProviderBase.generated.cst
а также/DataAccessLayer/EntityProviderBaseCore.generated.cst
и, вероятно,/DataAccessLayer/EntityProviderBaseCoreClass.generated.cst
,Это, в свою очередь, приведет к изменениям на уровне сущности (
/Entities/
) такие какEntityBaseCore.generated.cst
а такжеEntityInstanceBase.generated.cst
,
Мой общий совет заключается в том, что хотя NetTiers и CodeSmith были инструментами выбора для создания DAL несколько лет назад, я не мог рекомендовать идти по этому пути в наши дни. С развитием Microsoft Entity Framework и NHibernate с открытым исходным кодом вам больше не нужно погружаться слишком глубоко в канальный уровень доступа к данным (даже если только на уровне генерации кода).