14

次のような状況があります。

  1. MyCompany.MyProject.Domainドメイン モデルと部分クラス (など) を含むプロジェクトContact

  2. 姓と名の簡単な URL フレンドリーなテキスト表現を提供Contactするプロパティを使用してクラスを (拡張メソッドではなく部分クラスによって) '拡張' したいと考えています。Slug

  3. ToSlug()私のUtilityプロジェクトMyCompany.MyProject.Utilitiesには、2) で必要なことを正確に行う文字列拡張メソッドがあります。

  4. 問題: 私のUtilityプロジェクトは既に私のプロジェクトを参照しています。これは、循環参照を引き起こさずにプロジェクトのメソッドをプロジェクトに表示させるDomainことができないことを意味します。DomainUtilityToSlug()

Slugこれを解決するために別のプロジェクトを作成することに熱心ではなく、ロジックを共有したいと思っています。

どうすればこれを解決できますか?

4

4 に答える 4

16

あなたUtilityを参照するあなたのプロジェクトMyCompany.MyProject.Domainは、少しコードの匂いがするようです。ここでは、これらは特にドメイン オブジェクトで動作するユーティリティであると想定しています。その場合はMyCompany.MyProject.Utilities、プロジェクト内に含めてみませんかDomain(当然、それに応じて名前空間を変更します)。

いずれにせよ、これらの種類の依存関係を解消する通常の方法は、1 つのプロジェクトに必要なものを一連のインターフェイスに抽象化し、それらを別のアセンブリにカプセル化することです。ただし、それを行う前に、概念的に行っていることが正しいことを確認してください。

ただし、特定の状況では、インターフェースの導入を検討してくださいINameHolder

public interface INameHolder
{
    string FirstName { get; set; }
    string LastName { get; set; }
}

次にContact実装しINameHolderます。 INameHolder別のアセンブリに存在する場合は、 と呼びましょうMyCompany.MyProject.Domain.Interfaces

次に、UtilitiesプロジェクトはInterfaces( not Domain ) を参照し、そうしますがDomainInterfaces何も参照しません。循環参照が壊れています。

于 2009-08-23T09:20:42.517 に答える
2

ToSlug メソッドをドメイン プロジェクトにコピーし、デリゲート ユーティリティの ToSlug 呼び出しをこの新しいメソッドにコピーします。

于 2009-08-23T09:17:32.930 に答える
2

ドメインを共有できず (おそらく正しい)、共有ライブラリのロジックを使用する必要がある場合は、実際には別のアセンブリを導入する必要があります。

または、ドメインでのリフレクションによって実行時にロジックをドメインにロードして、依存ライブラリにアクセスすることもできます。コンパイル時のチェックを中断するだけです。

于 2009-08-23T09:21:21.453 に答える
2

コードをユーティリティ DLL に保持することが確実な場合 (エリックの答えは私には賢いようです)、ユーティリティ プロジェクトでインターフェイスを作成し、そのインターフェイスをパラメーターとして ToSlug メソッドに渡し、ドメイン オブジェクトに実装させることができます。インターフェイス。

于 2009-08-23T09:35:21.147 に答える