Ihre beste Antwort ist, den Container tatsächlich zu verwenden.
Was Sie tun, ist "Wenn Sie diesen Typ erstellen, verwenden Sie diese spezifische Instanz des Objekts." Dies nutzt nicht die Fähigkeit des Containers, eine Instanz für Sie aufzubauen. Stattdessen sollten Sie IService1 und IService2 im Container registrieren. Sagen Sie dem Container dann, dass diese Abhängigkeiten für Sie aufgelöst werden sollen.
Es sieht ungefähr so aus:
container.RegisterType<IService1, SomeService1>();
container.RegisterType<IService2, SomeService2>();
Was dies bedeutet ist, den Behälter sagen „wenn es eine Abhängigkeit vom Typ IService1, neu auf ein neues Objekt vom Typ SomeService1 und gibt ihm, dass“ und in ähnlicher Weise für IService2 .
Als nächstes müssen Sie dem Container mitteilen, was mit ICustomerService zu tun ist. In den meisten Allgemeinheit, würden Sie dies tun:
container.RegisterType<ICustomerService, CustomerService>(
// Note, don't need to explicitly say transient, that's the default
new InjectionConstructor(new ResolvedParameter<IService1>(),
new ResolvedParameter<IService2>()));
Dies teilt den Behälter steht, wenn ICustomerService Lösung, neu eine Instanz von Customer mit dem Konstruktor auf, die IService1 und IService2 nimmt. Um diese Parameter abzurufen, rufen Sie den Container erneut auf, um diese Typen aufzulösen.
Dies ist ein bisschen ausführlich und ein häufiger Fall, also gibt es einige Abkürzungen. Zunächst einmal können Sie ein Type-Objekt zu tun, anstatt neue ResolvedParameter, wie so passieren:
container.RegisterType<ICustomerService, CustomerService>(
new InjectionConstructor(typeof(IService1), typeof (IService2)));
Als weitere Stenografie, wenn Customer nur einen Konstruktor hat, oder wenn das, die Sie genannt wollen, ist derjenige, der die größte nimmt In der Parameterliste können Sie den InjectionConstructor vollständig auslassen, da dies der Konstruktor ist, den der Container in Abwesenheit einer anderen Konfiguration auswählt.den Dienst als Lösung zurück durch den Behälter
container.RegisterType<ICustomerService, CustomerService>();
Das Formular Sie verwenden normalerweise verwendet wird, wenn Sie einen bestimmten Wert eher für einen Konstruktor Parameter übergeben werden soll.
Um Ihre ursprüngliche Frage zu beantworten - nun, Sie können nicht genau das tun, was Sie gesagt haben. Der Konstruktorparameter benötigt einen Wert irgendeiner Art. Du könntest alles andere hineinbringen, was du willst - null funktioniert normalerweise.
Hinweis Sie können auch die beiden Formen mischen. Zum Beispiel, wenn Sie IService1 lösen wollen und für die IService2 Parameter null übergeben, dies tun:
container.RegisterType<ICustomerService, CustomerService>(
new InjectionConstructor(typeof(IService1), null));
* EDIT *
Basierend auf dem Kommentar unten, was Sie wirklich wollen, ist ein weiteres Merkmal - benannte Registrierungen.
Im Grunde haben Sie zwei Implementierungen von IService1 und IService2. Also, was Sie tun können, registrieren Sie beide, und dann sagen Sie dem Container, welchen zu verwenden.
Zunächst einmal, die zweite Implementierung zu registrieren, benötigen Sie einen eindeutigen Namen geben:
container.RegisterType<IService1, OtherService1Impl>("other");
Dann können Sie den Behälter sagen IService1 zu lösen, aber den Namen verwenden. Dies ist der Hauptgrund dafür, dass der ResolvedParameter-Typ existiert. Da Sie nur den Standardwert für IService2 möchten, können Sie typeof() als Kurzschrift verwenden. Sie müssen weiterhin beide Typen für die Parameter angeben, benötigen jedoch keinen bestimmten Wert. Wenn das irgendeinen Sinn ergibt.
container.RegisterType<ICustomerService, CustomerService>(
new InjectionConstructor(new ResolvedParameter<IService1>("other"), typeof(IService2));
Das sollte tun, was Sie brauchen.
Hallo and.maz, Sie eine Lösung erhalten haben, wo Sie nicht brauchen, wie auch die anderen Parameter zu schaffen geben. etwas wie Schlüsselwert, wo wir den Namen des Konstruktors und den Wert angeben können – rdhaundiyal