2016-03-24 7 views
1

Wenn ich so etwas wie dieses:Initialisieren eine Liste in DryIoc

 var container = new Container(); 
     container.RegisterInstance("a", serviceKey: "a"); 
     container.RegisterInstance("b", serviceKey: "b"); 

Wie melde ich eine Liste der Zeichenfolge, die „a“ und „b“ enthalten?

Ich habe auch versucht, Params, aber mit keinem Erfolg.

class T 
    { 
     public string[] x; 

     public T(string s, params string[] strs) 
     { 
      x = (new[] {s}).Union(strs).ToArray(); 
     } 
    } 

    static void Main(string[] args) 
    { 
     var container = new Container(); 
     container.RegisterInstance("a", serviceKey: "a"); 
     container.RegisterInstance("b", serviceKey: "b"); 
     container.Register<T>(made: Made.Of(() => new T(Arg.Of<string>("a")))); 
     container.Register<T>(made: Made.Of(() => new T(Arg.Of<string>("a"), Arg.Of<string>("b")))); 

EDIT:

ich es geschafft, diese am Laufen zu haben, aber es könnte nicht eine gute workarround sein:

 container.RegisterInstance(typeof(IEntityManager), (IEntityManager)ctx.GetObject("entityManager_candidate"), serviceKey: "candidate"); 
     container.RegisterInstance("XYZ_CANDIDATE", serviceKey: "candidate"); 
     container.Register<IDalCandidate>(serviceKey: "candidate", 
      made: Made.Of(() => new DalCandidate(Arg.Of<IEntityManager>("candidate"), Arg.Of<string>("candidate")))); 
     container.RegisterInstance(typeof(IEntityManager), (IEntityManager)ctx.GetObject("entityManager_resource"), serviceKey: "resource"); 
     container.RegisterInstance("XYZ_RESOURCE", serviceKey: "resource"); 
     container.Register<IDalCandidate>(serviceKey: "resource", 
      made: Made.Of(() => new DalCandidate(Arg.Of<IEntityManager>("resource"), Arg.Of<string>("resource")))); 
     //container.RegisterMapping<IDalCandidate, DalCandidate>() 
     var lst = new List<IDalCandidate> 
     { 
      container.Resolve<IDalCandidate>("resource"), 
      container.Resolve<IDalCandidate>("candidate") 
     }; 
     container.RegisterInstance(typeof(IList<IDalCandidate>), lst); 
     container.Register<ISearchWeightedCandidateManager, SearchWeightedCandidateManager>(); 
+0

Ich bin mir nicht sicher, was Sie erreichen möchten. Sie können String-Werte mit String-Schlüsseln als KeyValuePair [] einfügen, dann können Sie normales Linq verwenden. Wenn Sie alle Arten von Dienstschlüsseln benötigen, verwenden Sie KeyValuePair []. Mehr Infos hier https://bitbucket.org/dadhi/dryioc/wiki/RegisterResolve#markdown-header-resolving-as-keyvaluepair-wrapper – dadhi

+0

Ich brauche eine Liste von in einige Konstruktoren injizieren (SearchWeightedCandidateManager erfordert eine IList von IDalCandidate). –

+0

Dann injizieren Sie eine Liste, was ist das Problem? DryIoc unterstützt IList Wrapper. – dadhi

Antwort

0

Update: bessere Antwort

Ein Blick auf Ihre Probe wieder .. Grundsätzlich haben Sie eine Art von Mandantenfähigkeit, und dann injizieren alle Mieter in einigen Verbraucher.

c.Register<Dal>(serviceKey: "x"); 
c.Register<Dal>(serviceKey: "y"); 

// using delegate for brevity, better convert to method 
Func<object, Func<RequestInfo, bool>> getCondition = 
    key => r => r.Parent.Enumerate().Any(p => p.ServiceKey == key); 
var inX = getCondition("x"); 
var inY = getCondition("y"); 

c.RegisterInstance("a", condition: inX); 
c.RegisterInstance("b", condition: inY); 

// register the rest of dependencies in X or in Y 

c.Register<Manager>(); // normally injects Dal[] 

Das ist die Idee zu demonstrieren. Ich hoffe, es wird für Ihren Fall relevanter sein als meine erste Antwort.

+0

Was passiert, wenn ich eine andere Zeichenfolge mit Serviceschlüsseln für eine andere Verwendung speichere, bevor dieser Code aufgerufen wird? Ich verstehe nicht, warum du fühlst, dass Listen ein Designgeruch sind. –

+0

Dann können Sie einen anderen Ansatz verwenden, um die für B erforderlichen Zeichenfolgen zu erhalten. Oder Sie verwenden ein bestimmtes Dienstschlüsselformat oder einen bestimmten Dienstschlüssel, um Zeichenfolgen zu unterscheiden, die für verschiedene Dienste erforderlich sind. Ich bin OK mit den Listen, aber Ihr Setup beruht auf Konventionen, die falsch konfiguriert werden können und schwer zu findende Fehler erzeugen. – dadhi