Estoy usando Prism, que también ofrece el bonito contenedor Unity IoC. Soy nuevo en el concepto, por lo que todavía no he podido darle la vuelta. Lo que quiero hacer ahora es crear un objeto usando el contenedor IoC, pero pasando un parámetro extra también. Permítanme explicar con un ejemplo ..:Creando objetos usando Unity Resolve con parámetros adicionales
Tengo una clase que toma un objeto de comandos. Esto se ha registrado en el contenedor IoC, por lo que manejarlo muy bien:
public class Person
{
public Person(IApplicationCommands commands) { .. }
..
}
Person person = _container.Resolve<Person>();
Ahora - Quiero pasar en otro argumento - por ejemplo, el nombre de la persona. Sin embargo, todavía quiero usar el contenedor IoC para manejar la resolución y, por lo tanto, obtener los otros parámetros del contenedor IoC. Pero pase el nombre como un parámetro "personalizado". Se puede hacer esto?
public class Person
{
public Person(IApplicationCommands commands, string name) { .. }
..
}
string name = "John";
Person person = _container.Resolve<Person>(name); // ....??
Este ejemplo no parece funcionar, pero ¿hay alguna manera de hacerlo funcionar? ¿O el contenedor Unity IoC requiere que todos los parámetros se registren en el contenedor antes de llamar a Resolve?
No recomendaría cualquiera de estos enfoques. Si bien el uso de contenedores delimitados o el registro de instancias con nombres lógicos son ciertamente técnicas válidas para algunos escenarios, no son apropiados dado el contexto presunto de creación de nuevas entidades DDD. Ciertamente no podría predecir qué nuevos objetos de Persona podrían necesitar crearse si esto está relacionado con el nuevo registro de clientes, e incluso si pudiera ... bueno, creo que comprende el problema que se presentaría. La segunda opción es sin duda más viable, pero es mejor expresar las dependencias requeridas a través de los parámetros del constructor ... –
Esto tampoco soluciona lo que veo es un defecto en el modelado de Person para empezar, y el uso directo del contenedor como un localizador de servicios para la creación de dicho tipo. –
Ciertamente, la opción del contenedor de alcance es la más tonta de las dos opciones, pero funciona. También asumí que el OP simplificó su pregunta y no está tratando de hacer algo como esto en una Entidad simple, sino un objeto de servicio más complejo. Tengo este problema todo el tiempo con estos objetos donde el objeto tiene algunas dependencias, pero también necesito que se pasen algunos datos de instancia sobre los que tengo que actuar cuando se pasan. Esta es la razón por la que otros contenedores IoC, como Ninject, admiten exactamente lo que desea OP. La unidad aún no lo hace. –