2009-01-29 21 views
6

¿Cómo se manejan los tipos primitivos cuando se usa un contenedor IoC?Tipos primitivos y contenedores IoC

I.e. dado que usted tiene:

class Pinger { 
    private int timeout; 
    private string targetMachine; 

    public Pinger(int timeout, string targetMachine) { 
     this.timeout = timeout; 
     this.targetMachine = targetMachine; 
    } 

    public void CheckPing() { 
     ... 
    } 
} 

¿Cómo obtendría los argumentos int y string constructor?

+0

¡Gran pregunta! – Stimul8d

Respuesta

4

Haga otra interfaz para esto.

Entonces obtendrá algo como:

public Pinger(IExtraConfiguration extraConfig) 
{ 
    timeout = extraconfig.TimeOut; 
    targetmachine = extraconfig.TargetMachine; 
} 

No sé sobre otros contenedores COI, pero el castillo de Windsor resuelve estos parámetros de constructor adicionales de forma automática.

+0

Esto no resuelve el problema por un lado, y agrega complejidad en el otro. Tenemos que reconocer que IoC a veces deformará su código de maneras antinaturales con consecuencias negativas. Si necesita construir una orden con una variedad de tipos de Magdalena, tendrá que inyectar una instancia y mutarla con llamadas a métodos (olor fuerte). Puede inyectar un contexto, pero ¿cómo se configura dinámicamente en tiempo de ejecución? Tienes que mutar eso, también. Es hora de sacar la cabeza de la arena en esto y aceptar las verrugas con la belleza incuestionable de IoC. –

1

Depende. El IoC-Container StructureMap le permitirá declarar esas dependencias cuando configure la instancia al comienzo de su ejecución.

p. Ej. en un registro

ForRequestedType<Pinger>() 
    .TheDefault.Is.OfConcreteType<Pinger>() 
    .WithCtorArg("timeout").EqualTo(5000) 
    .WithCtorArg("targetMachine").EqualToAppSetting("machine"); 
1

En primavera, se puede buscar valores de propiedad de un archivo de propiedades utilizando la notación $ {propertyName}

<bean class="blah.Pinger"> 
    <constructor-arg value="${blah.timeout}"/> 
    <constructor-arg value="${blah.targetMachine}"/> 
</bean> 

En Spring.net la misma funcionalidad es proporcionada por el PropertyPlaceholderConfigurer, que tiene la misma sintaxis y usa secciones de valores de nombre en los archivos de configuración.

3

No estoy seguro de si su dificultad son los tipos de valores o el tipo de hormigón. Tampoco es un problema. No es necesario que introduzca una interfaz de configuración (es útil si desea pasar los mismos parámetros a varios objetos, pero no en el caso que ha proporcionado). De todos modos, aquí está el código fluido de Windsor, estoy seguro de que alguien enviará una versión XML pronto.

container.Register(
      Component.For(typeof(Pinger)) 
       .ImplementedBy(typeof(Pinger)) // This might not be necessary 
       .Parameters(Parameter.ForKey("timeout").Eq("5000"), 
          Parameter.ForKey("targetMachine").Eq("machine") 
       ) 
      ); 
Cuestiones relacionadas