6

He escrito una clase que tiene algunas dependencias que resuelve del contenedor de unidad.Instancia de registro de unidad y resolución

De mi clase principal que crear un nuevo objeto

MyObject myObject = new MyObject(); 

me registro con mi unidad de contenedores

UContainer.RegisterInstance<MyObject>(myObject, new ExternallyControlledLifetimeManager()); 

la puedo crear el tipo que necesita esto como una dependencia

ConsumerObject consumer = new ConsumerObject(); 

el consumidor se ve así:

public class ConsumerObject 
{ 
    public ConsumberObject() 
    { 
     theObject = (MyObject)UContainer.Resolve(typeof(MyObject));  
    } 
} 

Esto arroja una excepción:

Resolución de la dependencia fracasó, type = "MiObjeto", name = "". El mensaje de excepción es: La operación de compilación actual (clave de compilación Build Key [MyObject, null]) falló: el parámetro pp no ​​se pudo resolver al intentar llamar al constructor MyObject (IPreferenceStorageProvider pp). (Tipo de estrategia BuildPlanStrategy, índice 3)

¿Por qué mi llamada de resolución está intentando llamar a otro contsructor en el tipo? Ya he creado y registrado la instancia .. También lo probé como: theObject = UContainer.Resolve<MyObject>(); no parece hacer ninguna diferencia ..

Gracias

Respuesta

1

Por lo que yo sé Unidad trata (por defecto) para llamar al constructor con el mayor número de parámetros e intenta resolver cada uno de los parámetros de las asignaciones. Se debe agregar la asignación para IPreferenceStorageProvider o eliminar el constructor que requiere este parámetro.

Si no desea que el parámetro IPreferenceStorageProvider se inyecte por unidad, tal vez no se deba declarar como parámetro de constructor. Puede crear instancias de código duro de este objeto en el constructor predeterminado.

+2

El problema es la "MiObjeto" no es mi objetivo .. Tiene cerca de 15 constructores .. puedo crearlo, pero no tengo ningún control sobre su estructura .. ¿Por qué ¿está Unity intentando revivirlo de todos modos? Creé una instancia y la registré ... Ahora está en el contenedor como singleton, no debería estar llamando a ningún constructor ... ??? –

3

No estoy seguro de por qué estás viendo el comportamiento que eres. Acabo de crear una prueba que duplicó su escenario y funcionó bien.

Ha intentado algo como esto,

public class ConsumerObject 
{ 
    public ConsumberObject(MyObject myObject) 
    { 
     theObject = myObject 
    } 
} 

y luego usando UContainer.Resolve<MyObject>()?

Lo único que se me ocurre es cuando accede a UContainer.RegisterInstance y luego a UContainer.Resolve, está accediendo a dos contenedores diferentes. ¿Podría mostrarnos cómo declara UContainer?

6

Creo que el problema es que utiliza ExternallyControlledLifetimeManager. En este caso, el contenedor de Unity contiene solo una referencia débil a su instancia. Y cuando intentas resolver, tu instancia ya es basura recolectada. Es por eso que el LifeTimeManager predeterminado para .RegisterInstance() es ContainerControlledLifeTimeManager. Y el caso de Darrel Miller funciona, porque aún no está GC. Intenta registrar su instancia de esta manera:

UContainer.RegisterInstance<MyObject>(myObject); 
Cuestiones relacionadas