Альтернативне рішення
У моїй компанії ми уникаємо "перестрибування проектів", щоб потрапити на незвичайні проекти нижчого рівня. Наприклад, наш рівень презентації / API може посилатися лише на наш доменний рівень, а рівень домену може посилатися лише на рівень даних.
Однак це проблема, коли є переліки, на які потрібно посилатися як у презентаційному, так і в доменному шарах.
Ось рішення, яке ми реалізували (поки що). Це досить гарне рішення і добре працює для нас. Інші відповіді вражали все навколо.
Основна передумова полягає в тому, що переліки не можуть бути успадковані - але класи можуть. Тому...
// In the lower level project (or DLL)...
public abstract class BaseEnums
{
public enum ImportanceType
{
None = 0,
Success = 1,
Warning = 2,
Information = 3,
Exclamation = 4
}
[Flags]
public enum StatusType : Int32
{
None = 0,
Pending = 1,
Approved = 2,
Canceled = 4,
Accepted = (8 | Approved),
Rejected = 16,
Shipped = (32 | Accepted),
Reconciled = (64 | Shipped)
}
public enum Conveyance
{
None = 0,
Feet = 1,
Automobile = 2,
Bicycle = 3,
Motorcycle = 4,
TukTuk = 5,
Horse = 6,
Yak = 7,
Segue = 8
}
Потім, щоб "успадкувати" перерахунків в іншому проекті вищого рівня ...
// Class in another project
public sealed class SubEnums: BaseEnums
{
private SubEnums()
{}
}
Це має три реальні переваги ...
- Визначення перерахунків автоматично однакові в обох проектах - за визначенням.
- Будь-які зміни у визначеннях перерахунків автоматично повторюються у другому, не змінюючи другого класу.
- Перерахунки базуються на одному і тому ж коді - тому значення легко можна порівняти (з деякими застереженнями).
Для посилання на переліків у першому проекті ви можете використовувати префікс класу: BaseEnums.StatusType.Pending або додати "з використанням статичних BaseEnums;" заява на ваші узі.
У другому проекті, маючи справу з успадкованим класом, я не міг отримати підхід до "використання статичних ..." , тому всі посилання на "успадковані перерахунки" мають бути префіксом для класу, наприклад SubEnums.StatusType.Pending . Якщо хтось придумає спосіб дозволити використовувати " другий статичний" підхід у другому проекті, дайте мені знати.
Я впевнений, що це можна змінити, щоб зробити це ще краще - але це насправді працює, і я використовував такий підхід у робочих проектах.
Будь ласка, голосуйте за це, якщо вам це здається корисним.