Castle Windsor instala múltiples instancias de instancia por convención desde el objeto -- astle-windsor camp Relacionados El problema

Castle Windsor Install Multiple Instance Service By Convention From Object


1
vote

problema

Español

Después de realizar algunas lecturas, parece que pasar los tipos de datos en bruto en constructores no es la mejor manera de manejar la inyección del constructor (no está seguro de que esto sea verdadero o no, pero no, pero ok, lo comprará). Así que necesita algo de información del usuario (ingresado en el símbolo del sistema), estoy haciendo lo siguiente.

NOTA: Solo un ejemplo, pero es conceptualmente el mismo

  public interface IArg {     string Value{get;set;} }  public interface IServerNameArg : IArg{}  public class ServerName : IServerNameArg {     public string Value{get;set;} }  public interface ISomethingElseArg:IArg{}  public class SomethingElseArg : ISomethingElseArg {     public string Value{get;set;} }   public interface ICommandArgs {     IServerNameArg{get;set;}     ISomethingElseArg{get;set;] }   

Por lo tanto, por un proyecto anterior, hice algo similar, pero no tenía una interfaz para cada configuración y simplemente pasó todo el objeto alrededor dondequiera que se necesiten estas configuraciones. No es horrible, pero puedo ver algún valor en querer aprobar solo los argumentos relevantes.

  container.Register(Componenet     .For<IArgs>()     .Instance(args)   

Entonces, mi primera pregunta (si me acerco a este problema correctamente) es, ¿puedo hacer una instalación similar de INSTANCE utilizando la convención y tener cada propiedad de My Icommandargs e instalar como un servicio de instancia? No estoy seguro de lo que se vería, pero algo así como

  container.Register(Classes     .From(typeof(ICommandArgs))     .BasedOn<IArg>()     .WithServiceBase());   

Sé que puedo instalar cada propiedad individualmente, pero busco poder agregar args en el futuro y hacer que sean conectados a no tener que recordar para instalarlos también. Otro enfoque con el que estaba jugando fue usar LINQ y reflexión para obtener todas las propiedades de Tipo IARG de mi instancia de ICOMMANDARGS, luego instale cada una como una instancia.

¿Voy demasiado lejos? ¿Debo depender de la ICOMMANDARGS e instalar un servicio de instancia allí?

gracias de antemano

Original en ingles

After doing some reading it seems that passing raw data types into constructors is not the best way to handle the constructor injection (not sure that this is true or not but ok ill buy it). So Needing some info from the user (entered on the command prompt) I am doing the following.

NOTE: just an example but is conceptually the same

public interface IArg {     string Value{get;set;} }  public interface IServerNameArg : IArg{}  public class ServerName : IServerNameArg {     public string Value{get;set;} }  public interface ISomethingElseArg:IArg{}  public class SomethingElseArg : ISomethingElseArg {     public string Value{get;set;} }   public interface ICommandArgs {     IServerNameArg{get;set;}     ISomethingElseArg{get;set;] } 

So for a previous project I did something similar but did not have an interface for each setting and just passed the entire object around wherever these settings were needed. Not horrible but I can see some value in wanting to only pass the relevant arguments.

container.Register(Componenet     .For<IArgs>()     .Instance(args) 

So my first question (if i am approaching this issue properly) is can i do a similar .Instance install using convention and have each property of my ICommandArgs and install as an Instance service? Not sure what it would look like but something like

container.Register(Classes     .From(typeof(ICommandArgs))     .BasedOn<IArg>()     .WithServiceBase()); 

I know I can install each property individually but i am looking to be able to add args in the future and have them get wired up not having to remember to install them too. One other approach I was tinkering with was to use linq and reflection to get all the properties of type IArg from my instance of ICommandArgs then install each one as an instance.

Am i going too far? Should i just be dependant on the ICommandArgs and install an instance service there?

Thanks in advance

  

Lista de respuestas

0
 
vote
vote
La mejor respuesta
 

así que la reflexión es. Usando el código a continuación, estoy tirando de todas las propiedades de la instancia de "args"

          //get all properties from args class that implement IVar so they can be registered automatically           var argsToRegister = _args.GetType().GetProperties()                 .Where(x =>                     x.GetValue(_args) != null                     && x.PropertyType.GetInterfaces().Contains(typeof(IVar)))                 .Select(x => new                 {                     x.Name,                     Type = x.PropertyType,                     Value = x.GetValue(_args)                 }).ToList();   

Luego, registro cada uno como una instancia para todas las interfaces (esto es específico para mi solución y debe tener en cuenta lo que está registrando)

          //register each IVar from the args instance as instance vars         foreach (var arg in argsToRegister)         {             var types = arg.Type.GetInterfaces().ToList();             types.Add(arg.Type);              container.Register(Component                 .For(types)                 .Instance(arg.Value)                 .IsDefault()                );         }   

Luego voy y registre todos mis otros IVars que aún no han sido registrados

          //register all IVar that are not contained as properties in the args implementation          container.Register(Classes             .FromThisAssembly()             .BasedOn<IVar>()             .If(t=> !argsToRegister.Any(a=>a.Type.IsAssignableFrom(t)))             .WithServiceBase()         );   
 

so reflection it is. using code below i am pulling all the properties from the instance of "args"

        //get all properties from args class that implement IVar so they can be registered automatically           var argsToRegister = _args.GetType().GetProperties()                 .Where(x =>                     x.GetValue(_args) != null                     && x.PropertyType.GetInterfaces().Contains(typeof(IVar)))                 .Select(x => new                 {                     x.Name,                     Type = x.PropertyType,                     Value = x.GetValue(_args)                 }).ToList(); 

Then I register each one as an instance for all interfaces (this is specific to my solution and you should be mindful of what you are registering)

        //register each IVar from the args instance as instance vars         foreach (var arg in argsToRegister)         {             var types = arg.Type.GetInterfaces().ToList();             types.Add(arg.Type);              container.Register(Component                 .For(types)                 .Instance(arg.Value)                 .IsDefault()                );         } 

I then go and register all of my other IVars that have not already been registered

        //register all IVar that are not contained as properties in the args implementation          container.Register(Classes             .FromThisAssembly()             .BasedOn<IVar>()             .If(t=> !argsToRegister.Any(a=>a.Type.IsAssignableFrom(t)))             .WithServiceBase()         ); 
 
 

Relacionados problema

0  ¿Qué tan profundo debo ir en las clases para alaminar correctamente el Windsor de Castle para DI?  ( How deep must i go in the classes to properly wire up castle windsor for di ) 
Derecho, así que soy nuevo en el castillo y estoy tratando de averiguar qué tan lejos necesito ir a cablear un servicio. A continuación se muestra una muestra...

25  COI, ¿dónde pones el contenedor?  ( Ioc where do you put the container ) 
Estoy usando Castle Windsor para un proyecto de mascota en el que estoy trabajando. Estoy empezando a notar que necesito llamar al contenedor de la COI en dif...

4  Agregar comportamientos de operación con la instalación WCF  ( Adding operation behaviors with wcf facility ) 
Estoy usando la instalación del WCF por primera vez para organizar una pareja servicios, tanto en una aplicación de consola (para una fácil depuración) e IIS ...

2  MVC Múltiples solicitudes de AJAX con marco de entidades causan error  ( Mvc multiple ajax requests with entity framework causes error ) 
Tengo dos JQGRIDS que cargan datos a través de una llamada de Post AJAX a mi controlador y cada vez que ejecuto la aplicación, solo una de las dos publicacion...

3  ¿Los filtros de caché de ASP.NET MVC 3?  ( Does asp net mvc 3 cache filters ) 
Tengo un atributo unitofwork, algo como esto: public class UnitOfWorkAttribute : ActionFilterAttribute { public IDataContext DataContext { get; set; } ...

1  Actualización al último NServicebus y Castle Windsor  ( Upgrading to latest nservicebus castle windsor ) 
Estoy tratando de llegar a la última de NServicebus y Castle Windsor: Mi problema es que ahora el código exacto que se ejecutó, ya no hace: var _containe...

3  Estoy buscando un marco IOC / Di Simple pero práctico y robusto para .NET  ( I am looking for a simple yet practical and robust ioc di framework for net ) 
Voy a usarlo en un proyecto con desarrolladores menos experimentados, por lo que un marco complejo, como Spring.Net no es una opción. Estaba pensando en: n...

38  ¿Qué herramienta de inyección de dependencia debo usar? [cerrado]  ( Which dependency injection tool should i use ) 
Según lo que actualmente representa, esta pregunta no es un buen ajuste para nuestro Q & Amp; un formato. Esperamos que las...

6  Registro con fluidez Castle Windsor - ¿Qué hace la selección ()?  ( Castle windsor fluent registration what does pick do ) 
Cuando use la inscripción automática con Castle Windsor, veo a las personas que hacen cosas como _container.Register( AllTypes.Pick().FromAssembly(Assemb...

0  Castle Windsor y el mismo servicio registrado a partir de ensamblajes firmados con múltiples versiones  ( Castle windsor and same service registered from signed assemblies with multiple ) 
Tengo una aplicación que carga diferentes versiones de montaje firmemente firmado al mismo tiempo . Las clases en cada conjunto se escanean e instalan a trav...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos