webentwicklung-frage-antwort-db.com.de

Enterprise Library Unity im Vergleich zu anderen IoC-Containern

Welche Vor- und Nachteile hat die Verwendung von Enterprise Library Unity im Vergleich zu anderen IoC-Containern (Windsor, Spring.Net, Autofac ..)?

133
Yoann. B

Ich bereite eine Präsentation für eine Benutzergruppe vor. Als solches habe ich gerade ein paar von ihnen durchlaufen. Nämlich: AutoFac, MEF, Ninject, Spring.Net, StructureMap, Unity und Windsor.

Ich wollte den 90% -Fall vorführen (Konstruktor-Injection, wofür die Leute sowieso hauptsächlich ein IOC verwenden). Die Lösung finden Sie hier (VS2008)

Daher gibt es einige wesentliche Unterschiede:

  • Initialisierung
  • Objektabruf

Jede von ihnen hat auch andere Funktionen (einige haben AOP und bessere Gizmos, aber im Allgemeinen möchte ich, dass ein IOC Objekte für mich erstellt und abruft).

Hinweis: Die Unterschiede zwischen den verschiedenen Abrufen von Bibliotheksobjekten können mithilfe des CommonServiceLocator aufgehoben werden: http://www.codeplex.com/CommonServiceLocator

Damit bleibt uns die Initialisierung, die auf zwei Arten erfolgt: über Code oder über XML-Konfiguration (app.config/web.config/custom.config). Einige unterstützen beide, andere nur einen. Ich sollte beachten: Einige verwenden Attribute, um die IoC zu unterstützen.

Also hier ist meine Einschätzung der Unterschiede:

Ninject

Nur Code-Initialisierung (mit Attributen). Ich hoffe du magst Lambdas. Der Initialisierungscode sieht folgendermaßen aus:

 IKernel kernel = new StandardKernel(
                new InlineModule(
                    x => x.Bind<ICustomerRepository>().To<CustomerRepository>(),
                    x => x.Bind<ICustomerService>().To<CustomerService>(),
                    x => x.Bind<Form1>().ToSelf()
                    ));

StructureMap

Initialisierungscode oder XML oder Attribute. v2.5 ist auch sehr lambda'y. Alles in allem ist dies einer meiner Favoriten. Einige sehr interessante Ideen, wie StructureMap Attribute verwendet.

ObjectFactory.Initialize(x =>
{
    x.UseDefaultStructureMapConfigFile = false;
    x.ForRequestedType<ICustomerRepository>()
        .TheDefaultIsConcreteType<CustomerRepository>()
        .CacheBy(InstanceScope.Singleton);

    x.ForRequestedType<ICustomerService>()
        .TheDefaultIsConcreteType<CustomerService>()
        .CacheBy(InstanceScope.Singleton);

    x.ForConcreteType<Form1>();
 });

Einheit

Initialisierungscode und XML. Schöne Bibliothek, aber XML-Konfiguration ist ein Ärgernis. Tolle Bibliothek für Microsoft oder die Autobahnläden. Die Code-Initialisierung ist einfach:

 container.RegisterType<ICustomerRepository, CustomerRepository>()
          .RegisterType<ICustomerService, CustomerService>();

Spring.NET

XML nur so nah wie ich sagen kann. Aber für die Funktionalität macht Spring.Net alles unter der Sonne, was eine IoC kann. Da die einzige Möglichkeit zur Einheitlichkeit XML ist, wird dies von .net-Shops im Allgemeinen vermieden. Obwohl viele .net/Java-Shops Spring.Net verwenden, da die .net-Version von Spring.Net und das Spring-Projekt Java ähnlich sind.

Hinweis : Die Konfiguration im Code ist jetzt mit der Einführung von Spring.NET CodeConfig möglich.

Windsor

XML und Code. Wie Spring.Net wird Windsor alles tun, was Sie möchten. Windsor ist wahrscheinlich einer der beliebtesten IoC-Container.

IWindsorContainer container = new WindsorContainer();
container.AddComponentWithLifestyle<ICustomerRepository, CustomerRepository>("CustomerRepository", LifestyleType.Singleton);
container.AddComponentWithLifestyle<ICustomerService, CustomerService>("CustomerService",LifestyleType.Singleton);
container.AddComponent<Form1>("Form1");

Autofac

Kann sowohl XML als auch Code mischen (mit v1.2). Schöne einfache IoC-Bibliothek. Scheint, die Grundlagen mit nicht viel Aufhebens zu tun. Unterstützt verschachtelte Container mit lokaler Festlegung der Komponenten und einem genau definierten Lebensdauermanagement.

So initialisieren Sie es:

var builder = new ContainerBuilder();
builder.Register<CustomerRepository>()
        .As<ICustomerRepository>()
        .ContainerScoped();
builder.Register<CustomerService>()
        .As<ICustomerService>()
        .ContainerScoped();
builder.Register<Form1>();

Wenn ich heute wählen müsste: Ich würde wahrscheinlich mit StructureMap gehen. Es bietet die beste Unterstützung für C # 3.0-Sprachfunktionen und die größte Flexibilität bei der Initialisierung.

Anmerkung : Chris Brandsma verwandelte seine ursprüngliche Antwort in ein Blogpost .

233
Chris Brandsma

Soweit ich gesehen habe, sind sie ziemlich gleich, bis auf ein paar Implementierungsdetails hier und da. Der größte Vorteil von Unity gegenüber der Konkurrenz ist, dass es von Microsoft bereitgestellt wird. Es gibt viele Unternehmen, die Angst vor OSS haben.

Ein Nachteil ist, dass es ziemlich neu ist, so dass es möglicherweise Fehler gibt, die die älteren Spieler bereits behoben haben.

Trotzdem möchten Sie vielleicht check this out .

7
rodbv

Alter Thread, aber da dies das erste ist, was Google mir zeigte, als ich Unity vs Spring.net eintippte ...

Spring führt CodeConfig jetzt aus, wenn Sie XML config nicht mögen

http://www.springframework.net/codeconfig/doc-latest/reference/html/

Spring ist auch viel mehr als nur ein DI-Container. Wenn Sie sich den Abschnitt 'Module' in den Dokumenten ansehen, ist der DI-Container die Grundlage für den riesigen Stapel von Dingen, die er ausführt.

4
Richard

Korrigieren Sie mich, wenn ich mich irre, aber ich denke, dass Autofac selbst die XML-Konfiguration unterstützt, wie in diesem Link aufgeführt: Autofac XML Configuration

3
Felix Ngaserin

Spring verfügt über eine Funktion, mit der Parameter basierend auf dem Parameternamen oder der Position in Konstruktoren oder Eigenschaften eingefügt werden können. Dies ist sehr nützlich, wenn der Parameter oder die Eigenschaft ein einfacher Typ ist (z. B. eine Ganzzahl oder ein Boolescher Wert). Siehe das Beispiel hier . Ich glaube nicht, dass dies Spring 'Unfähigkeit, die Konfiguration im Code vorzunehmen, wirklich wettmacht.

Windsor kann dies auch und zwar in Code, nicht in Config. (korrigiere mich, wenn ich falsch liege, ich gehe einfach über das, was ich hier gehört habe).

Ich würde gerne wissen, ob Unity das kann.

2
Anthony

Eines ist zu beachten: Ninject ist der einzige IoC-Container, der kontextbezogene Abhängigkeitsinjektionen unterstützt (siehe Website). Da ich jedoch keine Erfahrung mit anderen IoC-Containern habe, kann ich nicht sagen, ob dies zutrifft.

2
ehsanullahjan

Nur um meine 2 Cent hinzuzufügen, habe ich sowohl StructureMap als auch Unity ausprobiert. Ich fand, dass StructureMap schlecht/irreführend dokumentiert ist, dass es schwierig zu konfigurieren und umständlich zu verwenden ist. Ebenso scheint es keine Szenarien wie das Überschreiben von Konstruktorargumenten zur Auflösungszeit zu unterstützen, was für mich ein wichtiger Verwendungspunkt war. Also ließ ich es fallen und ging zu Unity und ließ es in ungefähr 20 Minuten tun, was ich wollte.

1
Repo Man

Ich persönlich benutze Unity, aber nur, weil es von Microsoft stammt. Ich bedaure die Entscheidung aus einem Grund: Das Größte, was es dagegen hat, hat einen großen "Bug", der dazu führt, dass es ständig Ausnahmen auslöst. Sie können die Ausnahmen beim Debuggen ignorieren. Es verlangsamt jedoch Ihre Anwendung enorm , wenn Sie darauf stoßen, da das Auslösen einer Ausnahme eine teure Operation ist. Zum Beispiel "behebe" ich derzeit diese Ausnahme an einer Stelle in meinem Code, an der Unitys Ausnahmen die Renderzeit einer Seite um 4 Sekunden verlängern . Weitere Informationen und eine Problemumgehung finden Sie unter:

Kann Unity so eingestellt werden, dass SynchronizationLockException nicht die ganze Zeit ausgelöst wird?

1
Josh Mouch