Solution alternative
Dans mon entreprise, nous évitons de «sauter par-dessus les projets» pour accéder à des projets de niveau inférieur non communs. Par exemple, notre couche présentation / API ne peut référencer que notre couche domaine, et la couche domaine ne peut référencer que la couche données.
Toutefois, cela pose problème lorsqu'il existe des énumérations qui doivent être référencées à la fois par la présentation et les couches de domaine.
Voici la solution que nous avons implémentée (jusqu'à présent). C'est une assez bonne solution et fonctionne bien pour nous. Les autres réponses frappaient tout autour.
La prémisse de base est que les énumérations ne peuvent pas être héritées - mais les classes le peuvent. Donc...
// 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
}
Ensuite, pour "hériter" des énumérations dans un autre projet de niveau supérieur ...
// Class in another project
public sealed class SubEnums: BaseEnums
{
private SubEnums()
{}
}
Cela présente trois avantages réels ...
- Les définitions d'énumération sont automatiquement les mêmes dans les deux projets - par définition.
- Toutes les modifications apportées aux définitions d'énumération sont automatiquement répercutées dans la seconde sans avoir à apporter de modifications à la deuxième classe.
- Les énumérations sont basées sur le même code - les valeurs peuvent donc être facilement comparées (avec certaines mises en garde).
Pour référencer les énumérations dans le premier projet , vous pouvez utiliser le préfixe de la classe: BaseEnums.StatusType.Pending ou ajouter un "using static BaseEnums;" déclaration à vos utilisations.
Cependant, dans le deuxième projet, lorsque je traitais avec la classe héritée, je ne pouvais pas faire fonctionner l'approche "using static ..." , donc toutes les références aux "énumérations héritées" seraient préfixées avec la classe, par exemple SubEnums.StatusType.Pending . Si quelqu'un trouve un moyen d'autoriser l' utilisation de l' approche "en utilisant statique" dans le deuxième projet, faites-le moi savoir.
Je suis sûr que cela peut être modifié pour le rendre encore meilleur - mais cela fonctionne réellement et j'ai utilisé cette approche dans des projets de travail.
Veuillez voter positivement si vous le jugez utile.