Su mejor respuesta es usar el contenedor.
Lo que está haciendo es decir "al construir este tipo, use esta instancia específica del objeto". Esto no aprovecha la capacidad del contenedor para crear una instancia para usted. En su lugar, debe registrar IService1 e IService2 en el contenedor. Luego, dígale al contenedor que resuelva esas dependencias por usted.
se ve algo como esto:
container.RegisterType<IService1, SomeService1>();
container.RegisterType<IService2, SomeService2>();
Lo que esto hace es decirle al contenedor "cada vez que hay una dependencia de tipo IService1, nuevo un nuevo objeto de tipo SomeService1 y de la mano de esa" y lo mismo para IService2 .
Así que, a continuación, debe decirle al contenedor qué hacer con ICustomerService. En la mayor generalidad, que haría esto:
container.RegisterType<ICustomerService, CustomerService>(
// Note, don't need to explicitly say transient, that's the default
new InjectionConstructor(new ResolvedParameter<IService1>(),
new ResolvedParameter<IService2>()));
Esto le dice al contenedor: cuando se resuelve ICustomerService, nuevo hasta una instancia de Servicio a Cliente utilizando el constructor que toma IService1 y IService2. Para obtener esos parámetros, vuelva a llamar al contenedor para resolver esos tipos.
Esto es un poco detallado, y un caso común, por lo que hay algunos accesos directos. En primer lugar, se puede pasar un objeto de tipo en lugar de hacer nueva ResolvedParameter, así:
container.RegisterType<ICustomerService, CustomerService>(
new InjectionConstructor(typeof(IService1), typeof (IService2)));
Como otra forma abreviada, si a Cliente sólo tiene un constructor, o si el que usted desea llamado es el que lleva la mayor lista de parámetros, puede dejar InjectionConstructor completamente, ya que ese es el constructor que elegirá el contenedor en ausencia de otra configuración.
container.RegisterType<ICustomerService, CustomerService>();
El formulario que está utilizando normalmente se utiliza cuando se desea un valor específico para un parámetro pasado constructor en lugar de resolver el servicio a través del recipiente.
Para responder a su pregunta original, no puede hacer exactamente lo que ha dicho. El parámetro constructor necesita un valor de A de algún tipo. Sin embargo, podría poner cualquier otra cosa que desee, normalmente nulo funciona.
Tenga en cuenta que también puede mezclar los dos formularios. Por ejemplo, si desea resolver IService1 y pasar null para el parámetro IService2, haga lo siguiente:
container.RegisterType<ICustomerService, CustomerService>(
new InjectionConstructor(typeof(IService1), null));
* EDITAR *
Basado en el comentario anterior, lo que realmente quiere es otra característica - registros nombrados.
Básicamente, tiene dos implementaciones de IService1 y una de IService2. Entonces, lo que puedes hacer es registrarlos a ambos y luego decirle al contenedor cuál usar.
En primer lugar, para registrar la segunda aplicación, es necesario dar un nombre explícito:
container.RegisterType<IService1, OtherService1Impl>("other");
A continuación, puede decirle al contenedor para resolver IService1 pero el uso del nombre. Esta es la razón principal por la que existe el tipo ResolvedParameter. Como solo quiere el valor predeterminado para IService2, puede usar typeof() como una forma abreviada. Aún necesita especificar ambos tipos para los parámetros, pero no necesita un valor específico. Si eso tiene algún sentido.
container.RegisterType<ICustomerService, CustomerService>(
new InjectionConstructor(new ResolvedParameter<IService1>("other"), typeof(IService2));
Eso debería hacer lo que necesita.
Hola and.maz, llegaste cualquier solución en la que no es necesario para proporcionar los otros parámetros de tipo así. algo así como valor clave donde podemos especificar el nombre del constructor y el valor – rdhaundiyal