7

qualsiasi altro contenitore IoC .NET fornisce funzionalità equivalenti all'impianto di produzione tipizzato a Castle Windsor?Equivalenti di Castle Windsor Typed Factory Facility

ad es. se sto usando un Abstract Factory in un'applicazione WPF:

public class MyViewModel 
{ 
    private IAnotherViewModelFactory factory; 

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

Io non voglio avere a creare un'implementazione manuale di IAnotherViewModelFactory per ogni tipo di ViewModel voglio mostrare, voglio il contenitore di prendere cura di questo per me.

+0

Sembra che Ninject stia per: http://stackoverflow.com/questions/8166696/how-to-use-a-factory-with-dependecy-injection-without-resorting-to-using-service/8167100# 8167100 –

risposta

6

AutoFac ha una funzionalità denominata Delegate Factories, ma per quanto posso dire, funziona solo con i delegati e non con le interfacce.

non ho incontrato qualcosa di simile a Castello tipizzato fabbrica Struttura in nessuno dei due, né StructureMap Unità, ma questo non significa necessariamente che sono non c'è ...


L'unico modo che posso immagina che qualcosa di simile potrebbe essere implementato per le interfacce tramite un proxy dinamico. Dal momento che Castle Windsor dispone di un proxy dinamico, ma pochi altri contenitori hanno qualcosa di simile, questo potrebbe fare molto per spiegare perché questa funzione non è onnipresente.

Unity offre anche capacità di intercettazione, quindi deve disporre di una specie di implementazione proxy dinamica, ma sono abbastanza sicuro che non abbia nulla di equivalente a Fabbriche tipizzate. Rispetto ad altri contenitori, Unity è piuttosto semplice.

+0

Grazie Mark, vuol dire che normalmente avresti un riferimento al contenitore in ogni classe di fabbrica se non utilizzi la funzione Factory Typed di Castle? – devdigital

+0

No, significa che dovrei semplicemente codificarli manualmente.Se ce ne sono troppi, è possibile utilizzare i generici o qualche altra forma di riutilizzo del codice. –

+6

o semplicemente attenersi a Windsor –

3

In Autofac è possibile implementare fabbriche digitate in cima all'approccio delegato indicato da Mark. Per esempio.

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

Se questa classe è stato registrato con il contenitore, insieme a AnotherViewModel Autofac fornirà l'attuazione Func<AnotherViewModel> implicitamente:

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

Praticamente qualsiasi interfaccia è possibile implementare utilizzando tipizzati fabbrica struttura può essere implementato in Autofac utilizzando questo tipo di approccio. La differenza principale è che l'implementazione di Windsor configura la fabbrica tramite l'API di registrazione dei componenti, mentre in Autofac la fabbrica è un componente a sé stante.

Per esempi più sofisticati si potrebbe desiderare di guardare: http://code.google.com/p/autofac/wiki/RelationshipTypes e http://nblumhardt.com/2010/01/the-relationship-zoo/.

+0

+1, ma non dovrebbe essere l'implementazione di GetAnotherViewModel essere 'return _factory();'? –

+0

Grazie Mark, risolto! –

+1

Questa tecnica funziona esattamente allo stesso modo in Unity, comunque. –

1

Ho recentemente implementato un equivalente di Castle Windsor Typed Factories for Unity. È possibile trovare il progetto allo https://github.com/PombeirP/Unity.TypedFactories e il pacchetto NuGet allo http://nuget.org/packages/Unity.TypedFactories.

L'utilizzo è la seguente:

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

L'abbinamento dei parametri viene effettuata in base al nome, che va bene per le mie esigenze, anche se la libreria potrebbe facilmente essere esteso per supportare altre esigenze.