Я занимаюсь рефакторингом и пытаюсь повторно использовать мои обобщенные модели сущностей. В моем приложении есть несколько сборок, одна из которых является общедоступными типами (API), открытыми наружу, а другая содержит реализации провайдеров (таких как журнал).
Я бы хотел разделить генерацию сущностей и моделей так, чтобы сущности были в сборке API, а контейнер - в сборке реализации. Это возможно?
Возможно. Вот как я это сделал.
- Сборка А
- Database.EDMX
- Models.TT
- Models.cs
- Сборка B
Вот так все изложено. Вот грубые шаги:
- Щелкните правой кнопкой мыши на EDMX в A (сборка общедоступного API) и добавьте файл генерации кода
- Добавляет TT в проект. Называется это «Модели», так как он будет содержать только модели.
- Отредактировал TT и удалил генерацию кода для контейнеров сущностей
- В сборку B (внутренние реализации) добавлен Database.EDMA в виде ссылки
- Открывается в сборке B, щелкните правой кнопкой мыши и добавьте файл генерации кода
- Добавляет TT в проект B. Называется он EntityContainer, поскольку он будет содержать только это.
- Отредактировал TT, чтобы сделать следующее
- Удалены шаги создания сущности
- Изменен путь к Database.EDMX на относительный путь, указывающий на оригинальную копию в A
- Добавлено
using
для моих моделей
Надеюсь, все это скомпилируется и будет работать правильно (я все еще далек от того, чтобы все скомпилировать и протестировать). Хорошо выглядит до сих пор.
Дополнительные изменения:
В моем контейнере сущностей TT мне пришлось изменить определение EscapeEndTypeName следующим образом:
string EscapeEndTypeName(AssociationType association, int index,
CodeGenerationTools code)
{
EntityType entity = association.AssociationEndMembers[index]
.GetEntityType();
return code.CreateFullName(
code.EscapeNamespace(association.NamespaceName), code.Escape(entity));
}
Я использую association.NamespaceName
, поскольку он содержит правильное пространство имен из другой сборки.