7

¿Alguna otra .NET Los contenedores IoC ofrecen una funcionalidad equivalente a la instalación de fábrica tipada en Castle Windsor?Castle Windsor Typed Factory Facility Equivalentes

p. Ej. si estoy usando un patrón de fábrica abstracta en una aplicación WPF:

public class MyViewModel 
{ 
    private IAnotherViewModelFactory factory; 

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

yo no quiero tener que crear una aplicación manual de los IAnotherViewModelFactory para cada tipo de modelo de vista quiero mostrar, quiero que el recipiente para tomar me importa esto

+0

Parece que Ninject está a punto de - http://stackoverflow.com/questions/8166696/how-to-use-a-factory-with-dependecy-injection-without-resorting-to-using-service/8167100# 8167100 –

Respuesta

6

AutoFac tiene una función llamada Delegate Factories, pero hasta donde puedo decir, funciona solo con delegados, y no con interfaces.

no he encontrado nada similar al Fondo de fábrica con tipo de Castillo en ninguno StructureMap ni la unidad, pero eso no significa necesariamente que no están allí ...


La única manera de que pueda imagine que algo así podría implementarse para las interfaces a través de un proxy dinámico. Dado que Castle Windsor tiene un Proxy dinámico, pero pocos otros contenedores tienen algo similar, esto podría ser una gran ayuda para explicar por qué esta característica no es omnipresente.

Unity también ofrece capacidades de interceptación, por lo que debe tener algún tipo de implementación de proxy dinámico, pero estoy bastante seguro de que no tiene nada equivalente a las fábricas de tipografía. Comparado con otros contenedores, Unity es bastante básico.

+0

Gracias Mark, ¿eso significa que normalmente tendría una referencia al contenedor en cada clase de fábrica si no está utilizando Castle's Typed Factory Facility? – devdigital

+0

No, significa que simplemente los codificaré manualmente.Si hay demasiados, entonces podría usar genéricos o alguna otra forma de reutilización de código. –

+6

o simplemente se adhiere a Windsor –

3

En Autofac puede implementar fábricas tipadas en la parte superior del enfoque delegado Marcar menciones. P.ej.

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

Si esta clase se ha registrado en el contenedor, junto con AnotherViewModel Autofac proporcionará la implementación Func<AnotherViewModel> implícitamente:

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

Prácticamente cualquier interfaz se puede implementar utilizando Fondo con tipo de fábrica se puede implementar en Autofac usando este tipo de enfoque. La principal diferencia es que la implementación de Windsor configura la fábrica a través de la API de registro de componentes, mientras que en Autofac, la fábrica es un componente por derecho propio.

Para obtener ejemplos más sofisticados, puede consultar: http://code.google.com/p/autofac/wiki/RelationshipTypes y http://nblumhardt.com/2010/01/the-relationship-zoo/.

+0

+1, pero no debe la implementación de GetAnotherViewModel ser 'return _factory();'? –

+0

Gracias Mark, reparado! –

+1

Esta técnica funciona exactamente de la misma manera en Unity, por cierto. –

1

Recientemente he implementado un equivalente de Castle Windsor Typed Factories para Unity. Puede encontrar el proyecto en https://github.com/PombeirP/Unity.TypedFactories, y el paquete NuGet en http://nuget.org/packages/Unity.TypedFactories.

el uso es el siguiente:

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

La homogeneización de parámetros se realiza por su nombre, lo cual está bien para mis necesidades, aunque la biblioteca puede ampliarse fácilmente para apoyar otras necesidades.

Cuestiones relacionadas