unity scripts script posicion pasar otro obtener objeto mover escenas entre comunicacion unity-container

unity-container - scripts - transform unity



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

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

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

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

es decir:

public class Something { public Something(IUnityContainer container) { ... } }


La primera respuesta es algo de lo que estaba pensando. Gracias.

Antes de Unity, construimos nuestro propio contenedor IOC y tenemos una sintaxis similar a ...

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

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

En cuanto a configurarlo como estático: no me gusta usar ese enfoque porque cada objeto se vuelve dependiente 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 establece la estática, no puede (o no debe poder) entrometerse con ella, lo que limita los escenarios de prueba que puede crear.

Si nada más, entonces los objetos deberían al menos ser capaces de 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 info.

Arrendajo

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


La respuesta corta es sí.

Esto debería pasarse automáticamente cuando usas los métodos de 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 desea ver eso.

Actualización de prueba agregada:

[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; } }