代替ソリューション
私の会社では、一般的でない低レベルのプロジェクトに到達するために「プロジェクトを飛び越える」ことを避けています。たとえば、プレゼンテーション/ 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()
{}
}
これには3つの利点があります...
- 列挙型の定義は、定義により、両方のプロジェクトで自動的に同じになります。
- enum定義に対する変更は、2番目のクラスに変更を加えることなく、2番目のクラスに自動的にエコーされます。
- 列挙型は同じコードに基づいているため、値を簡単に比較できます(いくつかの注意事項があります)。
最初のプロジェクトで列挙型を参照するには、クラスの接頭辞BaseEnums.StatusType.Pending を使用するか、「static BaseEnumsを使用して」を追加します。あなたの使用への声明。
ただし、継承されたクラスを処理する2番目のプロジェクトでは、「静的を使用する...」アプローチを機能させることができなかったため、「継承された列挙型」へのすべての参照には、クラスの接頭辞が付きます。たとえば、SubEnums.StatusType.Pending。誰かが「スタティックの使用」を許可する方法を思いついた場合アプローチを2番目のプロジェクトで使用、私に知らせてください。
私はこれをさらに改善するために微調整できると確信しています-しかし、これは実際に機能し、作業プロジェクトでこのアプローチを使用しました。
参考になれば、投票してください。