Советы относительно модификации 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 с открытым исходным кодом вам больше не нужно погружаться слишком глубоко в канальный уровень доступа к данным (даже если только на уровне генерации кода).

Другие вопросы по тегам