Alternative Lösung
In meiner Firma vermeiden wir es, über Projekte zu springen, um zu nicht üblichen Projekten auf niedrigerer Ebene zu gelangen. Beispielsweise kann unsere Präsentations- / API-Schicht nur auf unsere Domänenschicht verweisen, und die Domänenschicht kann nur auf die Datenschicht verweisen.
Dies ist jedoch ein Problem, wenn es Aufzählungen gibt, auf die sowohl von der Präsentations- als auch von der Domänenschicht verwiesen werden muss.
Hier ist die Lösung, die wir (bisher) implementiert haben. Es ist eine ziemlich gute Lösung und funktioniert gut für uns. Die anderen Antworten waren rundum zutreffend.
Die Grundvoraussetzung ist, dass Aufzählungen nicht vererbt werden können - Klassen jedoch. Damit...
// 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
}
Dann, um die Aufzählungen in einem anderen übergeordneten Projekt zu "erben" ...
// Class in another project
public sealed class SubEnums: BaseEnums
{
private SubEnums()
{}
}
Das hat drei echte Vorteile ...
- Die Aufzählungsdefinitionen sind in beiden Projekten automatisch gleich - per Definition.
- Alle Änderungen an den Aufzählungsdefinitionen werden automatisch in der zweiten Klasse wiederholt, ohne dass Änderungen an der zweiten Klasse vorgenommen werden müssen.
- Die Aufzählungen basieren auf demselben Code, sodass die Werte leicht verglichen werden können (mit einigen Einschränkungen).
Um auf die Aufzählungen im ersten Projekt zu verweisen , können Sie das Präfix der Klasse verwenden: BaseEnums.StatusType.Pending oder ein "using static BaseEnums" hinzufügen. Aussage zu Ihren Nutzungen.
Im zweiten Projekt konnte ich jedoch beim Umgang mit der geerbten Klasse den Ansatz "using static ..." nicht zum Laufen bringen, sodass allen Verweisen auf die "geerbten Aufzählungen" die Klasse vorangestellt wurde, z. B. SubEnums.StatusType.Pending . Wenn jemand eine Möglichkeit findet, die Verwendung des statischen Ansatzes im zweiten Projekt zuzulassen , lassen Sie es mich wissen.
Ich bin sicher, dass dies optimiert werden kann, um es noch besser zu machen - aber das funktioniert tatsächlich und ich habe diesen Ansatz in Arbeitsprojekten verwendet.
Bitte stimmen Sie dies ab, wenn Sie es hilfreich finden.