いくつかのグローバルコンポーネントがあり、それらを設計に組み込む方法がわかりません。そのような:
設定クラス:プログラムの初期設定とのインターフェースであり、app.config(1way)、web.config(1way)、ハードコードされた値(1way)、またはsqldb(2way)の舞台裏である可能性があります。
言語クラス:さまざまな言語セットが含まれています。また、resxファイル(1way)、ハードコードされた値(1way)、またはsqldb(2way)が背後にある可能性があります。
最初の質問は、依存性注入でこれらのクラスをセッタープロパティにする必要があるかどうかです(私はWindsorを使用しています):
public ISettings Settings {set;}
public ILanguage Language {set;}
または、それらをアンビエントコンテキストにする必要があります。
string DoSomethingAndReportIt() {
//do something ...
var param = Settings.Current.SomeParam;
//report it ...
return Language.Current.SomeClass_SomeMethod_Job_Done;
}
.netライブラリには、実際にアンビエントコンテキストパターンを使用するコンポーネントがいくつかあることに気付きました。たとえば、System.Security.Principal、System.Web.ProfileBase、System.Thread.CurrentCulture ...
SettingsやLanguageなどのグローバルクラスをアンビエントコンテキストクラスにすることは害ではないと思いますか?そうでない場合、なぜDIが優先されるのですか?ユニットテストでは、アンビエントと比較してより多くの利点がありますか?
2番目の質問は、DIの方が優れている場合(DIパターンが好ましいと感じています)、Security.PrincipalやProfileなどの既存のアンビエントクラスをプロキシしてDIパターンに従うための良い方法は何ですか?