Предотвратить добавление конкретной сборки в мой заводской проект? - PullRequest
1 голос
/ 16 ноября 2009

Я создал заводскую сборку, которая может обрабатывать транзакции любого типа (которые поддерживают ITransactionType). Я могу добавить больше типов транзакций в отдельные сборки, все из которых будут работать с фабрикой, без необходимости перекомпиляции (что является одним из преимуществ фабрики).

Существует фактический список типов транзакций, которые можно обрабатывать, поэтому я определил статический класс с константными строками, который хранится в отдельной сборке. На это ссылаются другие сборки для обеспечения согласованных имен типов транзакций. Эта сборка не , на которую ссылается фабрика, поскольку она не должна знать, и это приведет к ненужным компиляциям этого проекта.

Все это работает просто отлично. Я никогда не буду ссылаться на сборку главного списка в заводском проекте, потому что он знает, что это не имеет смысла.

Однако я обеспокоен тем, что если проект поддерживается кем-то, кто не понимает всего этого, он может по ошибке добавить ссылку на сборку основного списка. Есть ли способ предотвратить добавление этой ссылки? Итак, если кто-то (возможно, даже я в будущем) добавит ссылку, есть ли способ заставить меня скомпилировать ошибку, указывающую на объяснение того, почему поведение неприемлемо?

1 Ответ

2 голосов
/ 16 ноября 2009

Я могу придумать несколько способов, хотя язык (.net, C #, vb), насколько я знаю, не предоставляет конкретного метода:

  1. Используйте управление исходным кодом (в любом случае, вы должны), после компиляции выгрузите проект из вашего решения (щелкните правой кнопкой мыши> выгрузить), отметьте его и отметьте как окончательный, только для чтения или как угодно, чтобы предотвратить дальнейшие изменения.
  2. Добавьте небольшой мини-скрипт, выполняющий этап предварительной компиляции, который проверяет наличие запрещенных ссылок (вы можете добавить его в свойствах проекта).
  3. Добавьте #warning к источнику, который всегда выдается: "не должен быть скомпилирован с XXX", пожалуйста, убедитесь, что он не в ".
  4. Использовать циклическую зависимость от себя: добавьте ссылку на фабрику Transaction в вашей библиотеке констант, это эффективно предотвратит добавление ссылки наоборот.
  5. Немного неприятнее: динамически проверять существование ссылки из cctor (статический конструктор), используя отражение, и выдавать исключение, если оно найдено. Это создаст жесткое исключение (но только в любом тесте), если кто-нибудь попытается добавить ссылку на эту библиотеку.
  6. Возможно, более простой: в ваших тестах nUnit (или в любой используемой вами тестовой среде) просто добавьте один тест: MustNotReferenceXXX и в его теле динамически проверьте, есть ли ссылка на lib.

Я обновлю, если смогу придумать что-нибудь попроще, хотя я считаю, что пункты 5 и 6 проще всего реализовать и они пригодны для будущего.

...