2017-11-01 1 views
1

Ich möchte einen serviceKey verwenden, um zwischen verschiedenen Implementierungen eines Service zu unterscheiden.Auflösen der Unterabhängigkeit in DryIoc mit einem ServiceKey schlägt fehl

Code Erläuterung: Es gibt eine ICat-Schnittstelle, die verwendet wird, um ein Katzenwort "Miau" zu "sagen". Das Wort "Miau" kommt von der Implementierung von ISoundProducer (es wird in eine Implementierung von ICat injiziert).

Ich registriere zwei Dienste (ICat und ISoundProducer) mit dem gleichen serviceKey = "x". Danach versuche ich eine ICat-Instanz aufzulösen, aber es schlägt fehl. Hier

ist die Demo-Code:

using DryIoc; 
using System; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Container ioc = new Container(); 
     ioc.Register<ISoundProducer, GoodCatSoundProducer>(serviceKey: "x"); 
     ioc.Register<ICat, GoodCat>(serviceKey: "x"); 

     var c1 = ioc.Resolve<ICat>("x"); 
     c1.Say(); 

     Console.ReadKey(); 
    } 
} 

public interface ISoundProducer 
{ 
    string ProduceSound(); 
} 

public class GoodCatSoundProducer : ISoundProducer 
{ 
    string ISoundProducer.ProduceSound() => "Meow"; 
} 

public interface ICat 
{ 
    void Say(); 
} 

public class GoodCat : ICat 
{ 
    private ISoundProducer _soundProducer; 
    public GoodCat(ISoundProducer soundProducer) => this._soundProducer = soundProducer; 
    void ICat.Say() => Console.WriteLine(_soundProducer.ProduceSound()); 
} 

Das gibt mir eine Ausnahme:

Unable ISoundProducer als Parameter "soundProducer" in GoodCat zu beheben: ICAT {ServiceKey = "x"} aus dem Behälter mit normalen und dynamischen Registrierungen: x {ID = 28, ImplType = GoodCatSoundProducer}}

Was mache ich falsch? Wie kann ich einen Dienst mit einem anderen injizierten Dienst auflösen, obwohl beide denselben serviceKey haben?

Antwort

2

den Schlüssel der Abhängigkeit angeben:

ioc.Register<ICat, GoodCat>(serviceKey: "x", 
    made: Made.Of(Parameters.Of.Type<ISoundProducer>(serviceKey: "x"))); 
ioc.Register<ISoundProducer, GoodCatSoundProducer>(serviceKey: "x"); 
+0

Aus irgendeinem Grund, es hilft nicht. Ich bekomme immer noch den gleichen Fehler. – Dima

+0

Huh Entschuldigung, ich habe die Cat - Sound - Produzentenbeziehung wieder aufgenommen. Jetzt sollte es funktionieren. – dadhi

+0

Ja, jetzt funktioniert es, und ich sehe, wie man es jetzt benutzt. Danke vielmals :) – Dima

Verwandte Themen