Frage

Was ist Vor-und Nachteile von vs andere IoC Container Enterprise Library Unity mit (Windsor, Spring.Net, Autofac ..)?

War es hilfreich?

Lösung

Ich bereite eine Präsentation für eine Benutzergruppe. Als solches Ich ging gerade durch eine Menge von ihnen. Nämlich:. Autofac, MEF, Ninject, Spring.Net, StructureMap, Einheitlichkeit, und Windsor

Ich wollte den 90% Fall (Konstruktor Injektion, die vor allem ist, was die Menschen ohnehin ein IOC verwenden) zeigen. Sie können hier die Lösung check out (VS2008)

Als solche gibt es ein paar wichtige Unterschiede:

  • Initialisierung
  • Objekt Retrieval

Jeder von ihnen andere Eigenschaften haben als auch (etwas AOP haben und eine bessere Spielereien, aber in der Regel alle möchte ich ein IOC tun erstellen und Objekte für mich abrufen)

Hinweis: die Unterschiede zwischen den verschiedenen Bibliotheken Objekt Retrieval unter Verwendung des CommonServiceLocator negiert werden kann: http: // www. codeplex.com/CommonServiceLocator

Das läßt uns mit der Initialisierung, die auf zwei Arten geschehen wird: über Code oder über XML-Konfiguration (app.config / web.config / custom.config). Eine gewisse Unterstützung beide, eine gewisse Unterstützung nur einen. Ich sollte anmerken. Einige Verwendung Attribute entlang der IoC helfen

So, hier ist meine Einschätzung der Unterschiede:

Ninject

Code-Initialisierung nur (mit Attributen). Ich hoffe euch gefällt lambdas. Initialisierung Code sieht wie folgt 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

Initialisierung Code oder XML oder Attribute. v2.5 ist auch sehr lambda'y. Alles in allem ist dies eine meiner Favoriten. Einige sehr interessante Ideen um wie StructureMap verwendet Attribute.

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>();
 });

Unity

Initialisierung Code und XML. Nizza Bibliothek, aber XML-Konfiguration ist ein Schmerz in den Hintern. Große Bibliothek für Microsoft oder die Autobahn Geschäfte. Code Initialisierung ist einfach:

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

Spring.NET

XML nur so nahe wie ich sagen kann. Aber für Funktionalität Spring.Net tut alles unter der Sonne, die ein IoC tun kann. Aber weil der einzige Weg ist über XML modularisieren ist es in der Regel von .net Geschäften vermieden. Obwohl viel .net / Java-Shop Nutzung Spring.Net wegen der Ähnlichkeit zwischen der .net-Version von Spring.Net und dem Java-Frühling-Projekt.

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

Windsor

XML und Code. Wie Spring.Net wird Windsor alles, was Sie es tun wollen könnte. Windsor ist wahrscheinlich eines der beliebtesten IoC Container um.

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

Autofac

Kann XML und Code (mit v1.2) mischen. Nizza einfache IoC Bibliothek. Scheint die Grundlagen mit nicht viel Aufhebens zu machen. Unterstützt verschachtelte Container mit lokalen Scoping von Komponenten und ein gut definierten Lebenszeitmanagement.

Hier ist, wie Sie initialisieren:

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

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

Hinweis : Chris Brandsma wandte seine ursprüngliche Antwort in eine

Andere Tipps

Alt Faden, aber da dieses das erste, was Google hat mir gezeigt, wenn ich in der Einheit eingegeben vs spring.net ...

Frühling macht CodeConfig jetzt, wenn Sie nicht XML-Konfigurations wie

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

Auch Frühling ist viel mehr als nur ein DI-Container, wenn Sie in der Dokumentation auf dem ‚Module‘ Abschnitt sehen, die DI-Container die Grundlage des riesigen Stapels von Dingen ist es tut.

korrigiert mich wenn ich falsch bin, aber ich denke, Autofac selbst XML-Konfiguration unterstützt, wie in diesem Link aufgeführt: Autofac XML-Konfiguration

Frühling hat eine Funktion, die es Parameter basierend auf den Parameternamen oder Position Konstruktor oder Eigenschaft zu injizieren. Dies ist sehr nützlich, wenn der Parameter oder eine Eigenschaft ist ein einfacher Typ (z eine ganze Zahl, eine boolean). Siehe das Beispiel hier . Ich glaube nicht, dass dies macht wirklich für Spring Unfähigkeit config in Code zu tun.

Windsor kann dies auch tun und kann es im Code nicht Config. (Korrigiert mich wenn ich falsch bin, werde ich nur über was ich hier gehört).

Ich würde gerne wissen, ob Unity dies tun kann.

Eine Sache zu beachten: Ninject ist der einzige IoC-Container, die Injektionen kontextuelle Abhängigkeit (wie pro ihre Website) unterstützt. Aber weil ich keine Erfahrung mit anderen IoC Container haben, kann ich nicht sagen, ob das hält.

Just my 2 cents hinzuzufügen, ich habe beide StructureMap und Unity versucht. Ich fand StructureMap schlecht / misguidingly dokumentiert zu sein, ein Schmerz in den Hintern zu konfigurieren und zu klobig zu verwenden. Ebenso scheint es nicht Szenarien wie Konstruktorargument Überschreibungen bei einer Auflösung von Zeit zu unterstützen, die für mich ein Schlüsselverwendungspunkt war. Also ließ ich es und ging mit Unity und hatte es zu tun, was ich in etwa 20 Minuten wollte.

Ich verwende Unity persönlich, aber nur, weil es von Microsoft. Ich bedaure die Entscheidung für einen Grund: die größte Sache, es hat dagegen einen großen „Bug“, die es immer wieder Ausnahmen auslöst verursacht. Sie können die Ausnahmen ignorieren beim Debuggen. Allerdings verlangsamt es Ihre Anwendung enorm , wenn Sie über sie laufen, da eine Ausnahme werfen eine teure Operation ist. Zum Beispiel bin ich „Festsetzung“ diese Ausnahme zur Zeit an einer Stelle in meinem Code, wo Unity Ausnahmen fügen eine zusätzliche 4 Sekunden , um eine Zeit Seite machen. Für weitere Informationen und eine Problemumgehung finden Sie unter:

Kann Unity gemacht werden, um nicht zu werfen SynchronizationLockException die ganze Zeit?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top