Ich habe einen Dienst mit 2 Abhängigkeiten: ein Repository und ein Gateway (SMS).Auflösen benannter Abhängigkeiten mit Unity
Ich muss 2 verschiedene Versionen des Dienstes auflösen, die sich nur in einem der Parameter unterscheiden, die an das Gateway übergeben werden.
Der Code wird vereinfacht wie folgt
public interface IService
{
string DoSomething();
}
public interface IServiceFoo
{
string DoSomething();
}
public interface IServiceBar
{
string DoSomething();
}
public interface IRepository { }
public class Repository : IRepository { }
public interface IGateway
{
string Name { get; set; }
}
public class Gateway : IGateway
{
public string Name { get; set; }
public Gateway(string name)
{
this.Name = name;
}
}
public class Service : IService, IServiceFoo, IServiceBar
{
private readonly IGateway _gateway;
private readonly IRepository _repo;
public Service(IRepository repo, IGateway gateway)
{
_gateway = gateway;
_repo = repo;
}
public string DoSomething()
{
return _gateway.Name;
}
}
Test Failing
[TestClass]
public class UnityTest
{
[TestMethod]
public void TestMethod1()
{
var container = new UnityContainer();
container
.RegisterType<IRepository, Repository>()
.RegisterType<IGateway, Gateway>("FooGateway", new InjectionConstructor("I am foo"))
.RegisterType<IGateway, Gateway>("BarGateway", new InjectionConstructor("I am bar"))
.RegisterType<IServiceFoo, Service>(new InjectionConstructor(new ResolvedParameter<IRepository>(), new ResolvedParameter<IGateway>("FooGateway")))
.RegisterType<IServiceBar, Service>(new InjectionConstructor(new ResolvedParameter<IRepository>(), new ResolvedParameter<IGateway>("BarGateway")));
var barGateway = container.Resolve<IGateway>("BarGateway");
var fooGateway = container.Resolve<IGateway>("FooGateway");
var serviceBar = container.Resolve<IServiceBar>();
var serviceBarGatewayName = serviceBar.DoSomething();
var serviceFoo = container.Resolve<IServiceFoo>();
var serviceFooGatewayName = serviceFoo.DoSomething();
Assert.AreEqual("I am bar", barGateway.Name); // pass
Assert.AreEqual("I am foo", fooGateway.Name); // pass
Assert.AreEqual("I am bar", serviceBarGatewayName); // pass
Assert.AreEqual("I am foo", serviceFooGatewayName); // FAIL
Die falsche Gateway übergeben wird, wenn der Dienst behoben ist, aber wenn ich namentlich das Gateway explizit lösen, es kommt richtig heraus. Ich denke, ich vermisse etwas Grundlegendes wie ResolvedParameter (String-Name) funktioniert, aber ich nahm an, dass es nach einem Typ in dem Container mit diesem Namen sucht.
mit ParameterOverride wie getan werden von InjectionConstructor, so dass Sie einen expliziten Code anstelle von ResolvedParameter haben. Dies sollte funktionieren, aber ich kann nicht beantworten, warum dies nicht mit Ihrer Version funktioniert. –
@WiktorZychla Ich habe eine injectionfactory versucht, aber hatte ähnliche Ergebnisse, wo in diesem Zusammenhang das falsche Gateway gelöst wurde, obwohl ich es mit Namen aufgelöst habe. Ich werde am Morgen mit diesem vereinfachten Beispiel noch einmal versuchen und den Testfall mit den Ergebnissen aktualisieren. – drch
Werde es auch morgen versuchen. Es ist 22 Uhr hier, also melde ich mich am Morgen. –