1つのアセンブリを除くすべてのアセンブリから「セッター」を隠すにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/3878391

質問

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

とにかく - Qに、これが可能かどうかわからない。ソリューション/回避策を探しています。

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

MyCompany.MyProject.Domain.POCO

このアセンブリには次のようなポコがあります:

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

今、私は別のクラスライブラリを持っています。これは私のDAL/リポジトリであり、永続性にエンティティフレームワーク4.0を使用します。

MyCompany.MyProject.Repositories

このアセンブリには、PoCo(Grab DBオブジェクト、POCOへのプロジェクト、リターン、およびPOCOの変更)でCRUD操作を実行する必要があるため、PoCoプロジェクトへの参照があります。

今、私も持っています ウェブアプリケーション, 、POCOアセンブリとリポジトリアセンブリの両方を参照しています。

私がこれを行う場合:

somePOCO.PostId = 10;

sqlexceptionを取得します PostID データベース内のIDフィールドであるため、説明設定されてはなりません。

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

通常のアクセシビリティ修飾子でそれを行う方法は考えられません(それらのどれもシナリオに適していないので)、皆さんは回避策を考えていきますか?

役に立ちましたか?

解決

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

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

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

他のヒント

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

 [assembly: InternalsVisibleTo( "MyCompany.MyProject.Repositories" )]  

ルーク・シェーファーの 良い答えです。質問の技術的要件を満たします。しかし、これが将来問題に対処しないかもしれないという理由だけで注意することをお勧めします。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top