usar usan una público puede porque multiples miembro las interfaz interfaces implementar implementacion declarar declaracion como caracteristicas c# mvvm-light

c# - usan - no puede implementar un miembro de interfaz porque no es público



MVVM SimpleIoc, cómo usar una interfaz cuando la implementación de la interfaz requiere parámetros de construcción (1)

Usando SimpleIoc de MVVM, me gustaría registrar una implementación para una interfaz dada, pero la implementación requiere un parámetro en su constructor:

public class MyServiceImplementation : IMyService { public MyServiceImplementation(string contructorString) { ... } }

Esperaba que el registro de la implementación de la interfaz funcionara, pero SimpleIoc no considera la sugerencia cuando intenta resolver la interfaz.

SimpleIoc.Default.Register<MyServiceImplementation>(() => { return new MyServiceImplementation("Hello World"); }); SimpleIoc.Default.Register<IMyService, MyServiceImplementation>();

¿Habría una manera de hacer esto con SimpleIoc, o debería considerar usar un Ioc más completo?

Edit: Esto funciona, pero todavía me pregunto por qué el formulario anterior no funciona.

SimpleIoc.Default.Register<IMyService>(() => { return new MyServiceImplementation("Hello World"); });


La razón por la que su primer enfoque no funciona es que SimpleIOC no se usa para construir los objetos.

Dada tu declaracion

SimpleIoc.Default.Register<MyServiceImplementation>(() => { return new MyServiceImplementation("Hello World"); }); SimpleIoc.Default.Register<IMyService, MyServiceImplementation>();

La llamada a SimpleIoc.Default.GetInstance<MyServiceImplementation>() ejecutará el método de fábrica, mientras que la llamada a SimpleIoc.Default.GetInstance<IMyService>() no lo hará.

Una posible forma de encadenar las llamadas podría ser especificar un método de fábrica para ambos tipos, IMyService y MyServiceImplementation , es decir,

SimpleIoc.Default.Register<MyServiceImplementation>(() => { return new MyServiceImplementation("Hello World"); }); SimpleIoc.Default.Register<IMyService>(() => { return SimpleIoc.Default.GetInstance<MyServiceImplementation>(); });