12 Stimmen

Wie übergibt man Argumente an einen Konstruktor in einem IOC-Framework?

Wie kann ich Argumente an einen Konstruktor in einem IOC-Framework übergeben? Ich möchte etwas tun wie: (Ich versuche, IOC-Framework-unabhängig zu sein ;) )

object objectToLogFor = xxx;
container.Resolve<ILogging>(objectToLogFor); 

public class MyLogging : ILogging
{
    public MyLogging(object objectToLogFor){}
}

Dies scheint in StructureMap nicht möglich zu sein. Aber ich würde mich freuen, wenn mir jemand das Gegenteil beweisen könnte.

Sind andere Frameworks reichhaltiger an Funktionen? Oder verwende ich das IOC-Framework auf die falsche Weise?

1 Stimmen

Weiß jemand, wie man das mit Unity macht?

9voto

Edward Wilde Punkte 24839

In der Strukturkarte können Sie dies mit der Methode With erreichen:

string objectToLogFor = "PolicyName";
ObjectFactory.With<string>(objectToLogFor).GetInstance<ILogging>();

Siehe: http://codebetter.com/blogs/jeremy.miller/archive/2008/09/25/using-structuremap-2-5-to-inject-your-entity-objects-into-services.aspx

1 Stimmen

Dies hätte die Antwort sein müssen

5voto

Remco Ros Punkte 1407

Für Schloss Windsor:

var foo = "foo";
var service = this.container.Resolve<TContract>(new { constructorArg1 = foo });

Beachten Sie die Verwendung eines anonymen Objekts zur Angabe von Konstruktorargumenten.

mit StructureMap:

var foo = "foo";
var service = container.With(foo).GetInstance<TContract>();

0 Stimmen

Was ist TContract? Ich sehe es auch überall in DNN v5. Was ist das Äquivalent davon in C#? Danke!

0 Stimmen

TContract ist der von Ihnen angegebene generische Typ, Generics ist ein C#-Feature. Siehe msdn.microsoft.com/de-us/library/ms379564(VS.80).aspx

4voto

skaffman Punkte 389758

Wie kann dies sprachunabhängig sein? Dies ist ein Detail der Implementierung des fraglichen Rahmens.

Mit Spring können Sie c'tor args als eine Liste von Werten/Referenzen angeben, wenn Sie das möchten. Im Vergleich zu Property Injection ist das allerdings nicht sehr lesbar.

Manche Leute regen sich darüber auf und bestehen darauf, dass C'tor Injection der einzige thread-sichere Ansatz in Java ist. Technisch gesehen haben sie Recht, aber in der Praxis ist das eher unwichtig.

3voto

Romain Verdier Punkte 12565

Dieses Bedürfnis dürfte nicht sehr häufig vorkommen, aber manchmal ist es berechtigt. Ninject die leichter ist als StructureMap, ermöglicht die Übergabe von Parametern beim Abrufen transienter Objekte aus dem Kontext. Spring.NET auch.

In den meisten Fällen sind die in einem IoC-Container deklarierten Objekte nicht transient und akzeptieren andere nicht-transiente Objekte über Konstruktoren/Eigenschaften/Methoden als Abhängigkeiten.

Wenn Sie den Container jedoch wirklich als Fabrik verwenden wollen und genügend Kontrolle über die aufzulösenden Objekte haben, können Sie die Eigenschafts- oder Methodeninjektion verwenden, auch wenn dies in gewisser Weise weniger natürlich und riskanter klingt.

0voto

cynicalman Punkte 5781

Ja, andere Frameworks sind funktionsreicher - Sie müssen ein ioc-Framework verwenden, das Konstruktorinjektion ermöglicht. Spring ist ein Beispiel für einen mehrsprachigen ioc-Container, der die Injektion von Konstruktorabhängigkeiten ermöglicht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X