Alternatywne rozwiązanie
W mojej firmie unikamy „przeskakiwania projektów”, aby dostać się do nietypowych projektów niższego poziomu. Na przykład nasza warstwa prezentacji / interfejsu API może odwoływać się tylko do naszej warstwy domeny, a warstwa domeny może odwoływać się tylko do warstwy danych.
Jest to jednak problem, gdy istnieją wyliczenia, do których należy odwoływać się zarówno prezentacja, jak i warstwy domen.
Oto rozwiązanie, które wdrożyliśmy (do tej pory). Jest to całkiem dobre rozwiązanie i działa dobrze dla nas. Inne odpowiedzi dotyczyły tego wszystkiego.
Podstawową przesłanką jest to, że nie można dziedziczyć enum - ale klasy mogą. Więc...
// 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
}
Następnie, aby „odziedziczyć” wyliczenia w innym projekcie wyższego poziomu ...
// Class in another project
public sealed class SubEnums: BaseEnums
{
private SubEnums()
{}
}
Ma to trzy prawdziwe zalety ...
- Definicje wyliczania są automatycznie takie same w obu projektach - z definicji.
- Wszelkie zmiany definicji wyliczenia są automatycznie powtarzane w drugiej sekundzie, bez konieczności wprowadzania jakichkolwiek modyfikacji w drugiej klasie.
- Wyliczenia oparte są na tym samym kodzie - więc wartości można łatwo porównać (z pewnymi zastrzeżeniami).
Aby odwołać się do wyliczeń w pierwszym projekcie , możesz użyć prefiksu klasy: BaseEnums.StatusType.Pending lub dodać „przy użyciu statycznego BaseEnums;” oświadczenie dotyczące twoich zastosowań.
Jednak w drugim projekcie dotyczącym odziedziczonej klasy nie mogłem uzyskać podejścia „za pomocą statycznego ...” , więc wszystkie odniesienia do „dziedziczonych wyliczeń” byłyby poprzedzone klasą, np. SubEnums.StatusType.Pending . Jeśli ktoś wymyśli sposób, aby pozwolić na użycie „statycznego” podejścia w drugim projekcie, daj mi znać.
Jestem pewien, że można to ulepszyć, aby uczynić go jeszcze lepszym - ale to faktycznie działa i zastosowałem to podejście w działających projektach.
Proszę głosować za tym, jeśli okaże się to pomocne.