私はSimple Injectorを使用していますが、おそらく私が必要としているのは概念的な答えです。
アプリケーション設定とのインターフェースがあるとします。
public interface IApplicationSettings
{
bool EnableLogging { get; }
bool CopyLocal { get; }
string ServerName { get; }
}
次に、通常、IApplicationSettings を実装するクラスを持ち、指定されたソースから各フィールドを取得します。たとえば、次のようになります。
public class AppConfigSettings : IApplicationSettings
{
private bool? enableLogging;
public bool EnableLogging
{
get
{
if (enableLogging == null)
{
enableLogging = Convert.ToBoolean(ConfigurationManager.AppSettings["EnableLogging"];
}
return enableLogging;
}
}
...
}
でも!EnableLogging
app.config、CopyLocal
データベース、およびServerName
現在のコンピューター名を取得する別の実装から取得したいとします。組み合わせごとに 1 つずつ、9 つの実装を作成することなく、アプリの構成をミックスマッチできるようにしたいと考えています。
インターフェイスはインジェクター (コンテナー) によって解決されるため、パラメーターを渡すことができないと想定しています。
私は最初にこれを考えました:
public interface IApplicationSettings<TEnableLogging,TCopyLocal,TServerName>
where TEnableLogging : IGetValue<bool>
where TCopyLocal : IGetValue<bool>
where TServerName : IGetValue<string>
{
TEnableLogging EnableLog{get;}
TCopyLocal CopyLocal{get;}
TServerName ServerName{get;}
}
public class ApplicationSettings<TEnableLogging,TCopyLocal,TServerName>
{
private bool? enableLogging;
public bool EnableLogging
{
get
{
if (enableLogging == null)
{
enableLogging = Container.GetInstance<TEnableLogging>().Value
}
return enableLogging;
}
}
}
TEnableLogging
ただし、これには主な問題が 1 つあります。 ( である)のインスタンスを作成する方法を知るにはどうすればよいIGetValue<bool>
ですか? IGetValue<bool>
ああ、具象クラスによって実装される Value プロパティを持つインターフェースであると仮定します。ただし、具体的なクラスには、いくつかの詳細 (app.config のキーの名前など) が必要な場合とそうでない場合があります (単に常に true を返したい場合があります)。
私は依存性注入に比較的慣れていないので、間違った方法で考えているかもしれません。これを達成する方法について誰かアイデアがありますか?
(別の DI ライブラリを使用して答えることができますが、気にしません。その概念をつかむ必要があると思います。)