¿Puede un contenedor de unidad pasar una referencia de sí mismo como un parámetro constructor?

StackOverflow https://stackoverflow.com/questions/827756

  •  06-07-2019
  •  | 
  •  

Pregunta

¿Hay alguna forma de que un contenedor de unidad pase a un objeto?

es decir:

public class Something {

     public Something(IUnityContainer container) {
           ...
     }
}
¿Fue útil?

Solución

La respuesta corta es sí.

Esto se debe pasar automáticamente cuando usas los métodos Resolve .

Por ejemplo:

IUnityContainer container = new UnityContainer();
var something = container.Resolve<Something>();

Además, esta es la misma técnica que utiliza Prism (en CodePlex) si quieres ver eso.

Prueba agregada de actualización:

[TestClass]
public class Spike
{
    [TestMethod]
    public void unityTest()
    {
        var container = new UnityContainer();
        var something= container.Resolve<Something>();
        Assert.AreSame(container, something.Container);
        // This passes. Success.
    }
}

public class Something
{
    public Something(IUnityContainer container)
    {
        Container = container;
    }

    public IUnityContainer Container { get; set; }
}

Otros consejos

La primera respuesta es una especie de lo que estaba pensando. Gracias.

Antes de Unity, creamos nuestro propio contenedor IOC, y tenemos una sintaxis parecida a ...

<constructor>
    <param name="factory" value="[{factory}]"/>
</constructor>

La [{fábrica}] hace que se pase a sí misma como parámetro.

En cuanto a configurarlo como estático: no me gusta usar ese enfoque porque cada objeto depende de la propiedad individual (obviamente). Es menos reutilizable y menos comprobable, especialmente si la estática es de solo lectura (lo que debería ser). Una vez que se configura la estática, no puede (o no debe poder) meterse con ella, lo que limita los escenarios de prueba que puede crear.

Si nada más, entonces los objetos deberían al menos poder aceptar un contenedor como parámetro. Si no está allí, podría volver a caer en una estática.

Hemos ido por el camino de usar la instancia única, y terminamos cambiándolo todo. En mi opinión, los objetos deberían ser más flexibles que eso. Si el consumidor de los objetos quiere tener una sola instancia que pase a sus objetos, eso depende del consumidor. Pero, el objeto en sí mismo no debería requerirlo. Con la sintaxis que se muestra arriba, es realmente fácil pasar el contenedor a través del gráfico.

Gracias por la información.

Jay

Lo siento ... chico nuevo. Ahora veo que esto debería haber sido un comentario, no una respuesta.

Como mencionó Bendewey, puedes pasarlo, ya que es un objeto, como cualquier otro objeto, pero, ¿por qué pasarlo?

Solo tienes uno, ¿por qué no ser una propiedad estática a la que cualquier clase pueda acceder?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top