Ich verwende Unity in C#. Ich habe eine Schnittstelle, die ich IConnectionStringLoader
nenne, die zwei abgeleitete Schnittstellen haben.Unity-Registrierungen überschreiben einander
public interface IConnectionStringLoader
{
string Get();
void Write();
}
public interface IDbConnectionStringLoader : IConnectionStringLoader
{
}
public interface IMetaDataConnectionStringLoader : IConnectionStringLoader
{
}
Es hat nur eine Implementierung:
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);
}
}
wie Meine Registrierung aussieht:
container.RegisterType<IMetaDataConnectionStringLoader, ConnectionStringLoader>(new InjectionConstructor("MetaConnection"));
container.RegisterType<IDbConnectionStringLoader, ConnectionStringLoader>(new InjectionConstructor("DbConnection"));
Der Punkt der Schnittstellen ist, dass ich die verschiedenen Schnittstellen in meinen Klassen injizieren kann und Ermitteln Sie die richtige Verbindungszeichenfolge für jede Implementierung. Aber das Problem ist, dass die letzte Registrierung die vorherige überschrieben wird.
var foo = _container.Resolve<IDbConnectionStringLoader>();
var bar = _container.Resolve<IMetaDataConnectionStringLoader>();
foo.Write();
bar.Write();
Ausgang ist:
DbConnection
DbConnection
Wenn ich die Reihenfolge der Anmeldung invertieren der Ausgang MetaConnection
zweimal sein wird. Meine Schlussfolgerung ist also, dass die letzte Registrierung die vorherige überschreibt. wenn ich die Implementierung einer abgeleiteten Klasse ändern funktioniert es jedoch:
public class SomeOtherConnectionStringLoader : ConnectionStringLoader
{
public ConnectionStringLoaderImpl(string connectionStringName) : base(connectionStringName)
{
}
}
Und die Registrierungen ändern:
container.RegisterType<IMetaDataConnectionStringLoader, ConnectionStringLoader>(new InjectionConstructor("MetaConnection"));
container.RegisterType<IDbConnectionStringLoader, SomeOtherConnectionStringLoader >(new InjectionConstructor("DbConnection"));
Jetzt ist alles funktioniert, aber ich verstehe nicht, warum. Ich habe verschiedene Lebenszeichen ausprobiert, aber mit dem gleichen Ergebnis. Ich dachte, Unity würde versuchen, eine Instanz von ConnectionStringLoader
mit dem "richtigen" Injektionsparameter basierend auf der Schnittstelle zu erstellen, aber es scheint hier eine andere Logik zu geben.
Irgendwelche Vorschläge, warum sich die Registrierungen gegenseitig überschreiben?
Wie Sie 'Write' nennen, obwohl es nicht Teil ist der Schnittstelle? –
Gut finden @ YacoubMassad. Ich habe es hinzugefügt, nachdem ich den Code eingefügt habe, um einen einfachen Test zu erstellen. Es ist nicht wirklich Teil der Logik, außer zu beweisen, dass die falsche Injektion injiziert wurde. Ich werde meine Frage bearbeiten. Danke, dass du es bemerkst. – smoksnes