クライアントが簡単にオブジェクトのプロパティを変更できないように、以前の記事では、会員のアクセスレベルを解決するために、私は、オブジェクトアダプタを使用しました。ユーザーは自分の練習が円の周りであることをコメントし、確かに、この方法は、オブジェクトのプロパティを変更するために故意にクライアントを防ぐことはできませんが、ある程度、保護効果を果たして:少なくとも誤用の可能性を減らしますセックス。
今日、実際には、我々は、同様の効果がSystem.Runtime.CompilerServices.InternalsVisibleToAttributeこの機能を達成することができることを見出しました。以下は手順です。
- この仮定ExposedSetter.Library SourcedAggregationRootクラスライブラリは、内部セッターを持つクラス属性が含まれています。まず、デジタル署名のExposedSetter.Library。右の「プロパティ」を選択ExposedSetter.Libraryプロジェクトをクリックしてください。選択して「署名」ページでオプション「アセンブリに署名」して、厳密な名前のキーファイルを指定します。ExposedSetter.Libraryは以下のように設定SourcedAggregationRootコード及び署名
パブリッククラスSourcedAggregationRoot:IVersionControllable
{
プライベートロングバージョン。
プライベートロングブランチ。
#region IVersionControllableメンバー
公共長いバージョン
{
取得 { この返し .versionを。}
内部集合 { この .version = 値。}
}
公共長い支店
{
取得 { この返し .branchを。}
内部集合 { この .branch = 値。}
}
#endregion
公共オーバーライド文字列のToString()
{
返される文字列 .Format("版= {0}、分岐= {1}" 、
バージョン、分岐);
}
}
- のSourcedAggregationRootに内部セッタープロパティExposedSetter.Libraryを呼び出すために、新しいクラスライブラリを作成します。説明の便宜のために、私たちはこのクラスライブラリはExposedSetter.Library2を命名します。ExposedSetter.Libraryへの参照を追加しますが、ちょうどクラスのテストを書くために、このクラスライブラリでは、プロパティ値を設定するには、クラス内で直接内部セッタープロパティSourcedAggregationRootを呼び出します。
パブリッククラスClass1に
{
公共SourcedAggregationRootテスト()
{
SourcedAggregationRoot SARは= 新しいSourcedAggregationRootを();
sar.Branch = 125。
返す SARを。
}
}
同様に、ExposedSetter.Library2ためにデジタル署名を行う(これは重要です!)
- 注意、(公開鍵)の公開鍵ExposedSetter.Library2を取得します。SN.exeを使用し、Visual Studioののコマンドラインを起動します。それはむしろ、公開キートークンよりも、公開鍵であります
- InternalsVisibleToAttributeを追加するために、ExposedSetter.Library AssemblyInfo.csファイルを開きます。
[ アセンブリ:InternalsVisibleTo("ExposedSetter.Library2、のPublicKey = 0024000004800000940000000602000000240" +
"000525341310004000001000100bbccb249a2e7a1" +
"7cbddf86e24532777568cb13c2ea7643b61cf60367068f2b9ca785dca303c49f015823e4eaa17b" +
"50ed60ac47563dc8d8771358f10c3dc41f288530cfa350e6a2a24781dedeb8ec4138f93e76c537" +
"bce6c5aa7b25858fa90d6ef5c6ea613b1b49e6e287f9ebb7f990cfa0ce17fbfe1c338e95e88c14" +
"81f9598f")]
InternalsVisibleToAttributeパラメータは、その内部のメンバーのアセンブリ名と公開鍵データへのアクセスを許可指定し、注意してください。このバージョンでは組立およびその他の情報を設定することができない、またはコンパイラが通じ行くだろう。
- ソリューションをコンパイル
このように、C ++の友人のようなビット。私は上記のオブジェクトアダプタへのソリューションと比較して、このアプローチは、すべての後に、直接の.NET Frameworkによって、より専門的なサポートすることができますされていますが、より安全である、それは明示的の残りの部分をアクセスできるアセンブリを指定することができますあなたはアクセスできません。しかし、このアプローチにも欠点があります:私はExposedSetter.Libraryは内部メンバーを使用したい未来のアセンブリがあると、私はInteralsVisibleToAttribute特性を追加するために、コードExposedSetter.Libraryを変更する必要があります。
アドレス重版:http://www.cnblogs.com/daxnet/archive/2010/08/12/1797782.html
ます。https://www.cnblogs.com/jvstudio/archive/2010/08/12/1797812.htmlで再現