2010-11-01 12 views
10

Uso Castle Windsor como mi IoC container. Tengo una aplicación que tiene una estructura similar a la siguiente:Castle Windsor: Registro automático de tipos de un ensamblaje que implementa interfaces de otro

  • MyApp.Services.dll
    • IEmployeeService
    • IContractHoursService
    • ...
  • MyApp.ServicesImpl.dll
    • EmployeeService : MyApp.Services.IEmployeeService
    • ContractHoursService : MyApp.Services.IContractHoursService
    • ...

Puedo usar el XML configuration en este momento, y cada vez que añada un nuevo par/Servicio IService, tengo que añadir un nuevo componente para el XML archivo de configuración. Quiero cambiar todo esto al fluent registration API pero no funcionó exactamente la receta correcta para hacer lo que quiero todavía.

¿Alguien puede ayudar? Los estilos de vida serán todos singleton.

Muchas gracias de antemano.

Respuesta

12

Con AllTypes usted puede hacer esto:

De http://stw.castleproject.org/(S(nppam045y0sdncmbazr1ob55))/Windsor.Registering-components-by-conventions.ashx:

registrar componentes uno por uno puede ser trabajo muy repetitivo. Además, recordar registrar cada nuevo tipo que agregue puede conducir rápidamente a la frustración. Afortunadamente, no tienes que hacerlo, al menos siempre. Al utilizar la clase de entrada AllTypes puede realizar el registro grupal de tipos en función de algunas características especificadas que especifique.

creo que su registro se vería así:

AllTypes.FromAssembly(typeof(EmployeeService).Assembly) 
    .BasedOn<IEmployeeService>() 
    .LifeStyle.Singleton 

Si implementa un tipo base, como IService en las interfaces, se puede registrar todos a la vez siguiendo el siguiente método:

AllTypes.FromAssembly(typeof(EmployeeService).Assembly) 
    .BasedOn<IService>() 
    .WithService.FromInterface() 
    .LifeStyle.Singleton 

Para ver más ejemplos, consulte el artículo. Esto tiene una muy buena descripción de cuáles son las posibilidades.

+0

Esto no hace al 100% lo que necesito, sin embargo. Existen diferentes interfaces de servicio en el primer ensamblaje, y tengo un mapeo de uno a uno con una instancia concreta. Tendría que escribir el código anterior una y otra vez, como hago ahora para la configuración xml. –

+0

¿Es una opción tener una interfaz base para 'IEmployeeService'? Eso fue lo que hice. Puede decirle a Windsor que busque esa interfaz, registre todo debajo de ella (por lo tanto, específicamente 'IEmployeeService') con las implementaciones del ensamblado. Ampliado la respuesta con un ejemplo. –

+0

¿Quiere decir que tiene un simple 'IService' sin miembros que actúe como una interfaz de marcador? Eso podría funcionar, solo esperaba poder evitarlo. :) –

3

Tomé Pieter's answer hacia delante sólo un poco (el ser clave, ya que él sugirió, AllTypes) y han llegado con esto:

// Windsor 2.x 
container.Register(
    AllTypes.FromAssemblyNamed("MyApp.ServicesImpl") 
    .Where(type => type.IsPublic) 
    .WithService.FirstInterface() 
    ); 

Esto pasa a través de todas las clases públicas en la asamblea MyApp.ServicesImpl.dll y registra cada en el contenedor utilizando la primera interfaz que implementa. Como quiero todas las clases en el conjunto de servicios, no necesito una interfaz de marcador.

Lo anterior funciona para una versión anterior de Windsor. La corriente Castle Windsor documentation for registering components para la versión más reciente sugiere lo siguiente:

// Windsor latest 
container.Register(
    AllTypes.FromAssemblyNamed("MyApp.ServicesImpl") 
    .Where(type => type.IsPublic) // Filtering on public isn't really necessary (see comments) but you could put additional filtering here 
    .WithService.DefaultInterface() 
    ); 
+0

no necesita' Where (type => type .IsPublic) '. Windsor solo escaneará los tipos exportados (lo que significa público o público anidado) de forma predeterminada. –

+0

Pensé eso, pero creo que necesitas 'Where (something)' porque el método 'WithService' no está en el valor de retorno de' FromAssemblyNamed() '. Oh, a menos que tuviera un #intellisensefail ... Comprobaré ... –

+0

Acabo de verificar, definitivamente no compila para mí. Dado que actualmente estoy en una versión anterior de Windsor, asumiré que se trata de eso y actualizo la respuesta anterior con respecto a la última versión de Windsor. Muchas gracias por la entrada. :) –

Cuestiones relacionadas