我在Unity中使用C#。我有一個接口我叫IConnectionStringLoader
,它有兩個派生的接口。Unity註冊互相重疊
它只有一個執行:
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
如果I反註冊的輸出將是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"));
現在一切正常,但我不明白爲什麼。我嘗試過不同的終生管理者,但結果相同。我認爲Unity會嘗試用基於界面的「正確」注入參數來創建一個ConnectionStringLoader
的實例,但在這裏似乎還有其他一些邏輯。
任何建議爲什麼註冊覆蓋對方?
你是如何調用'Write'雖然它不是一部分的界面? –
好找@YacoubMassad。我在這裏粘貼代碼後創建了一個簡單的測試。這不是邏輯的一部分,除了證明錯誤的注入已被注入外。我將編輯我的問題。感謝您的注意。 – smoksnes