2

私は他の質問でこの問題をほのめかしましたが、それは私が言及した他のシナリオに実際には依存していないので、それを独自の質問に分割する価値があると思います。

とにかく-Qに、これが可能かどうかわからない。解決策/回避策を探しています。

私はクラスライブラリを持っていますが、POCOだけがあります。

MyCompany.MyProject.Domain.POCO

このアセンブリには、次のようなPOCOがあります。

public class Post
{
   public int PostId { get; set; }
   public int Name { get; set; }
      ...
}

今、私は別のクラスライブラリを持っています。それは私のDAL /リポジトリであり、永続性のためにEntityFramework4.0を使用しています。

MyCompany.MyProject.Repositories

このアセンブリは、POCOに対してCRUD操作を実行する必要があるため(DBオブジェクトを取得し、POCOにプロジェクトし、戻り、POCOを変更する)、POCOプロジェクトへの参照があります。

これで、POCOアセンブリとリポジトリアセンブリの両方への参照を持つWebアプリケーションもあります。

私がこれを行う場合:

somePOCO.PostId = 10;

PostIdはデータベースのIDENTITYフィールドであり、明示的に設定しないでください。SQLExceptionが発生します。

これらの特別なプロパティのセッターを非表示にして、リポジトリのみがセッターにアクセスできるようにする方法はありますか?

通常のアクセシビリティ修飾子を使用してそれを行う方法を考えることはできません(シナリオに適していないため)、回避策を考えていただけますか?

4

3 に答える 3

6

セッターを内部にし、内部をリポジトリアセンブリから見えるようにすることができます

[assembly: InternalsVisibleTo("MyLibrary.Repositories")]
public class Post
{
   public int PostId { get; internal set; }
   public int Name { get; internal set; }
      ...
}

これは、すべてがこれらのプロパティを「取得」できることを意味しますが、このアセンブリとリポジトリを含むアセンブリのみが「設定」できます。

于 2010-10-07T03:13:56.157 に答える
2

すべてのセッターを内部としてマークしてから、InternalsVisibleTo属性をPOCOアセンブリに追加します。

 [assembly: InternalsVisibleTo( "MyCompany.MyProject.Repositories" )]  
于 2010-10-07T03:12:08.343 に答える
1

LukeSchaferの答えは良い答えです。質問の技術的要件を満たしています。ただし、これでは将来問題が解決されない可能性があるため、注意が必要です。

エンジニアリングについて提案するのではなく、設定可能なIDプロパティを持つこれらのオブジェクトで何をしているのかをさらに抽象化することを検討することをお勧めします。この属性装飾を使用してこの「可視性」を作成するだけで十分かもしれませんが、これは問題の一種のハックだと思います。これらのオブジェクト間の相互作用を他のものとカプセル化して、コードの消費からセッターアクセスを削除する方がクリーンな場合があります。

于 2010-10-07T03:26:45.760 に答える