アプリケーション構成を簡素化するライブラリに取り組んでいます。基本的に、ライブラリのコンシューマーは、構成クラスを属性で装飾するか、コードで宣言的に設定を初期化します。構成プロパティ (アクセサ) を読み書きするソースを 1 つ以上指定するか、クラスからデフォルトを継承することができます。たとえば、次のようになります。
[ConfigurationNamespace(DefaultAccessors = new Type[] { typeof(AppSettingsAccessor) })]
public class ClientConfiguration : Configuration<IClientConfiguration>
{
[ConfigurationItem(Accessors = new Type[] {
typeof((RegistryAccessor))
})]
public bool BypassCertificateVerification { get; set; }
}
と同等です
var config = new Configuration<IClientConfiguration>();
config.SetDefaultAccessors(new[] { typeof(AppSettingsAccessor) });
config.SetPropertyAccessors(
property: x => x.BypassCertificateVerification,
accessors: new[] { typeof(RegistryAccessor) }
);
アクセサーは、さまざまなソース (AppSettings、レジストリ、.ini など) からの読み取りと書き込みを処理します。消費者がニーズに合わせて機能を拡張できるようにしたいと考えています。私はそれをIoCコンテナにとらわれないようにしたいと思います。Type[] 制約が与えられているのは、コンパイル時と実行時の問題のために属性に型を指定できないためです。
これらをインスタンス化するためのデフォルトのメカニズム (たとえば、Activator.CreateInstance に基づくもの) を持つ方法はありますが、サービス ロケーター/依存関係リゾルバー パターンを使用せずに、消費するコードが実行時にこれらのアクセサーをインスタンス化できるようにする方法はありますか? サービスロケーター/依存関係リゾルバーパターンがなぜ悪のアンチパターンなのかについてよく読んでいますが、その仕事のためのより良いツールを見つけることができません。依存関係リゾルバーを使用している MVC フレームワークと SignalR ライブラリが表示されます。彼らは 100% 悪を行っているのでしょうか、それとも特殊なケースでしょうか? 私が知る限り、抽象的なファクトリ パターンは Type パラメータを好まないため、うまくいきません。
この特定のケースでは、属性ベースの構成は宣言型アプローチよりも有用であるため、構成属性を放棄したくありません (これにより、Type を IConfigurationAccessor に変更し、ファクトリ アプローチに切り替えることができます)。