私はC#でUnityを使用しています。私はIConnectionStringLoader
と呼ばれるインターフェースを持っていて、2つの派生インターフェースを持っています。ユニティ登録が互いにオーバーライドします
1つだけの実装を持っている:私の登録は、このようになります
public class ConnectionStringLoader : IDbConnectionStringLoader, IMetaDataConnectionStringLoader
{
private readonly string _connectionStringName;
public ConnectionStringLoader(string connectionStringName)
{
_connectionStringName = connectionStringName;
}
public string Get()
{
var cs = ConfigurationManager.ConnectionStrings[_connectionStringName];
if (cs != null)
{
return cs.ConnectionString;
}
return null;
}
public void Write()
{
Console.WriteLine(_connectionStringName);
}
}
:
container.RegisterType<IMetaDataConnectionStringLoader, ConnectionStringLoader>(new InjectionConstructor("MetaConnection"));
container.RegisterType<IDbConnectionStringLoader, ConnectionStringLoader>(new InjectionConstructor("DbConnection"));
インターフェースのポイントは、私は私のクラスに異なるインターフェースを注入することができますということで、各実装の正しい接続文字列を取得します。 しかし問題は、最後に登録されたものは前のものを上書きするということです。
var foo = _container.Resolve<IDbConnectionStringLoader>();
var bar = _container.Resolve<IMetaDataConnectionStringLoader>();
foo.Write();
bar.Write();
出力は次のとおりです。
DbConnection
DbConnection
私は登録順を逆にした場合、出力は二回MetaConnection
になります。今までの私の結論は、最後の登録が前のものを上書きするということです。
public class SomeOtherConnectionStringLoader : ConnectionStringLoader
{
public ConnectionStringLoaderImpl(string connectionStringName) : base(connectionStringName)
{
}
}
と登録を変更します:私はそれが動作派生クラスに実装を変更する場合は、
container.RegisterType<IMetaDataConnectionStringLoader, ConnectionStringLoader>(new InjectionConstructor("MetaConnection"));
container.RegisterType<IDbConnectionStringLoader, SomeOtherConnectionStringLoader >(new InjectionConstructor("DbConnection"));
今、すべてが動作しますが、私は理由を理解していません。私は別の生命探偵を試しましたが、同じ結果を得ました。私はユニティがインターフェイスに基づいて "正しい"注入パラメータでConnectionStringLoader
のインスタンスを作成しようとしていると思っていましたが、ここにいくつかの他のロジックがあるようです。
登録が互いに上書きされる理由を教えてください。
私は、登録名を使用して、次のアプローチに従うことが、より自然な見つけるだろうインターフェイスの? –
良いfind @ YacoubMassad。簡単なテストを作成するためにここにコードを貼り付けた後に追加しました。誤った注射が注射されたことを証明する以外に、実際にはロジックの一部ではありません。私は私の質問を編集します。気づいてくれてありがとう。 – smoksnes