2008-09-24 12 views
11

Wie kann ich Argumente an einen Konstruktor in einem IOC-Framework übergeben? Ich möchte wie etwas tun: (Der Versuch, IOC-Rahmen Agnostiker zu sein;))Wie Übergeben von Argumenten an einen Konstruktor in einem IOC-Framework

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

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

Es scheint, dass dies in StructureMap nicht möglich ist. Aber ich würde gerne jemanden sehen, der mir Unrecht beweist.

Sind andere Frameworks funktionsreicher? Oder verwende ich das IOC-Framework falsch?

+1

Jeder weiß, wie dies mit der Einheit zu tun? – mhamrah

Antwort

0

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

+0

SM erlaubt dies, daher die Down-Abstimmung – Schneider

4

Wie kann das sprachunabhängig sein? Dies ist ein Implementierungsdetail des fraglichen Frameworks.

Spring ermöglicht es Ihnen, c'tor Args als eine Liste von Werten/Referenzen anzugeben, wenn das Ihr Ding ist. Im Vergleich zur Property-Injektion ist es jedoch nicht gut lesbar.

Einige Leute werden heiß unter dem Kragen darüber, und darauf bestehen, dass c'tor Injektion der einzige thread-sichere Ansatz in Java ist. Technisch sind sie richtig, aber in der Praxis ist es nicht wichtig.

3

Es sollte kein sehr häufiges Bedürfnis sein, aber manchmal ist es ein gültiges. Ninject, die leichter als StructureMap ist, können Sie Parameter übergeben, wenn transiente Objekte aus dem Kontext abgerufen werden. Spring.NET auch.

Meistens sind in einem IoC-Container deklarierte Objekte nicht flüchtig und akzeptieren andere nicht flüchtige Objekte über Konstruktoren/Eigenschaften/Methoden als Abhängigkeiten.

Wenn Sie den Container jedoch wirklich als Factory verwenden möchten und genügend Kontrolle über die Objekte haben, die Sie auflösen möchten, können Sie Property oder Methodeninjektion verwenden, auch wenn es sich weniger natürlich und risikoreicher anhört irgendwie.

0

Andere IoC-Frameworks sind funktionsreicher.

I.e. Besuche die ParameterResolution mit Autofac

+0

Wieder muss ich dies als seine Desinformation abstimmen. SM unterstützt, was der Benutzer fragt, also ist etwas "funktionsreicher" nicht relevant, um Posterfrage zu lösen. – Schneider

0

Sie können auch tun, mit Windsor leicht

5

Für Castle Windsor:

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

Hinweis die Verwendung eines anonymen Objekts, um Konstruktorargumente anzugeben.

mit StructureMap:

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

Was ist TContract? Ich sehe es auch überall in DNN v5. Was ist das in C#? Vielen Dank. – Picflight

+0

TContract ist der generische Typ, den Sie angeben, Generics ist ein C# -Feature. Siehe http://msdn.microsoft.com/en-us/library/ms379564(VS.80).aspx –