MVVM SimpleIoc, как использовать интерфейс, когда реализация интерфейса требует параметров построения - PullRequest
19 голосов
/ 13 января 2012

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

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");
});

1 Ответ

26 голосов
/ 18 января 2012

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

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

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

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

Вызов SimpleIoc.Default.GetInstance<MyServiceImplementation>() выполнит фабричный метод, а вызов SimpleIoc.Default.GetInstance<IMyService>() - нет.

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

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

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