Подтвердить что ты не робот

MVVM SimpleIoc, как использовать интерфейс, когда для реализации интерфейса требуются параметры конструкции

Используя MVVM SimpleIoc, я хотел бы зарегистрировать реализацию для данного интерфейса, но для реализации требуется один параметр в его конструкторе:

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

Я надеялся, что регистрация реализации интерфейса будет работать, но SimpleIoc не рассматривает подсказку, когда пытается устранить интерфейс.

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

SimpleIoc.Default.Register<IMyService, MyServiceImplementation>();

Будет ли способ сделать это с помощью SimpleIoc, или я должен использовать более полный Ioc?

Изменить: Это трюк, но я все еще удивляюсь, почему форма выше не работает.

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

Ответ 1

Причина, по которой ваш первый подход не работает, заключается в том, что SimpleIOC не использует себя для построения объектов.

Учитывая ваше объявление

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

SimpleIoc.Default.Register<IMyService, MyServiceImplementation>();

Вызов SimpleIoc.Default.GetInstance<MyServiceImplementation>() будет выполнять метод factory, а вызов SimpleIoc.Default.GetInstance<IMyService>() - нет.

Возможным способом цепочки вызовов может быть указание метода factory для обоих типов, IMyService и MyServiceImplementation, т.е.

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

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