7

andere .NET-IoC-Container bieten die gleiche Funktionalität wie die getippte Fabrik in Castle Windsor?Castle Windsor Getippte Factory Facility-Entsprechungen

z.B. wenn ich ein abstraktes Werk Muster in einer WPF-Anwendung verwenden:

public class MyViewModel 
{ 
    private IAnotherViewModelFactory factory; 

    public void ShowAnotherViewModel() 
    { 
     viewController.ShowView(factory.GetAnotherViewModel()); 
    } 
} 

Ich will nicht für jede Art von Ansichtsmodell eine manuelle Implementierung von IAnotherViewModelFactory zu schaffen habe ich zeigen will, mag ich den Behälter nehmen Sorge dafür für mich.

+0

wie Ninject scheint, ist ungefähr - http://stackoverflow.com/questions/8166696/how-to-use-a-factory-with-dependecy-injection-without-resorting-to-using-service/8167100# 8167100 –

Antwort

6

AutoFac hat eine Funktion namens Delegate Factories, aber soweit ich das beurteilen kann, funktioniert es nur mit Delegaten und nicht mit Schnittstellen.

Ich habe nichts ähnlich wie Castle typisierten Fabrik Einrichtung in keinem der beiden StructureMap noch Einheit auftreten, aber das bedeutet nicht zwangsläufig, dass sie nicht da sind ...


Der einzige Weg, ich kann Stellen Sie sich vor, dass so etwas für Schnittstellen über einen dynamischen Proxy implementiert werden kann. Da Castle Windsor einen dynamischen Proxy hat, aber nur wenige andere Container etwas Ähnliches haben, könnte dies einen langen Weg erklären, warum dieses Feature nicht allgegenwärtig ist.

Unity bietet auch Abhörmöglichkeiten, also muss es eine Art von dynamischer Proxy-Implementierung haben, aber ich bin mir ziemlich sicher, dass es nichts mit typisierten Fabriken zu tun hat. Im Vergleich zu anderen Containern ist Unity eher einfach.

+0

Danke, bedeutet das, dass Sie normalerweise einen Verweis auf den Container in jeder Fabrikklasse haben, wenn Sie Castles typisierte Fabrikeinrichtung nicht verwenden? – devdigital

+0

Nein, es bedeutet, dass ich sie stattdessen manuell codiere.Wenn es zu viele gibt, können Sie entweder Generika oder eine andere Art der Wiederverwendung von Code verwenden. –

+6

oder einfach bei Windsor –

3

In Autofac können Sie typisierte Fabriken auf dem Delegate-Ansatz Mark Erwähnungen implementieren. Z.B.

class AnotherViewModelFactory : IAnotherViewModelFactory { 
    Func<AnotherViewModel> _factory; 
    public AnotherViewModelFactory(Func<AnotherViewModel> factory) { 
     _factory = factory; 
    } 
    public AnotherViewModel GetAnotherViewModel() { 
     return _factory(); 
    } 
} 

Wenn diese Klasse mit dem Behälter registriert ist, zusammen mit AnotherViewModel Autofac wird implizit die Func<AnotherViewModel> Implementierung bieten:

builder.RegisterType<AnotherViewModel>(); 
builder.RegisterType<AnotherViewModelFactory>() 
    .As<IAnotherViewModelFactory>(); 

Praktisch jede Schnittstelle, die Sie implementieren können typisierten Werkseinrichtungen verwendet, kann in Autofac implementiert werden diese Art von Ansatz. Der Hauptunterschied besteht darin, dass die Windsor-Implementierung die Factory über die API für die Komponentenregistrierung konfiguriert, während die Factory in Autofac eine eigenständige Komponente darstellt.

Für anspruchsvollere Beispiele, die Sie gerne betrachten: http://code.google.com/p/autofac/wiki/RelationshipTypes und http://nblumhardt.com/2010/01/the-relationship-zoo/.

+0

+1 bleiben, sollte aber nicht die Implementierung von GetAnotherViewModel 'return_factory();'? –

+0

Danke Mark, behoben! –

+1

Diese Technik funktioniert übrigens genauso in Unity. –

1

Ich habe vor kurzem ein Äquivalent von Castle Windsor typisierte Fabriken für Einheit implementiert. Sie finden das Projekt unter https://github.com/PombeirP/Unity.TypedFactories und das NuGet-Paket unter http://nuget.org/packages/Unity.TypedFactories.

Die Nutzung ist die folgende:

unityContainer 
    .RegisterTypedFactory<IFooFactory>() 
    .ForConcreteType<Foo>(); 

Der Parameter Matching von Namen getan wird, was für meine Bedürfnisse in Ordnung, obwohl die Bibliothek leicht erweitert werden könnte andere Bedürfnisse zu unterstützen.