MVVM Light SimpleIoc - PullRequest
       24

MVVM Light SimpleIoc

0 голосов
/ 17 мая 2018

Я использую WPF с MVVM Light в своем проекте. У меня есть небольшой вопрос о SimpleIoC контейнере и DI. Какой способ лучше использовать, или скажите мне, если мне не нужно использовать DI там.

Есть мой конструктор VM:

public MainViewModel(IDialogService dialogService, IChannelObserverService channelObserverService, IInternalBroadcastService internalBroadcastService, 
                         IUserDataAccessService userDataAccessService, IUserService userService)

И регистрация SimpleIoC:

 SimpleIoc.Default.Register<MainViewModel>(() => {
            return new MainViewModel(SimpleIoc.Default.GetInstance<IDialogService>(),
                                     SimpleIoc.Default.GetInstance<IChannelObserverService>(),
                                     SimpleIoc.Default.GetInstance<IInternalBroadcastService>(),
                                     SimpleIoc.Default.GetInstance<IUserDataAccessService>(),
                                     SimpleIoc.Default.GetInstance<IUserService>()); });

Пожалуйста, скажите мне, мне нужно использовать DI там? Сначала я использовал все сервисы, подобные этому:

public MainViewModel(){...}

User user = SimpleIoc.Default.GetInstance<IUserService>().GetCurrentLoggedUser();

или это:

private IDialogService dialogService;

public MainViewModel()
{
    dialogService = = SimpleIoc.Default.GetInstance<IUserService>();
}

private void MyMethod()
{
    dialogService.ShowQuestionDialog(abc,abc,abc);
}

Так что я не использовал DI, когда создавал свои View-модели.

1 Ответ

0 голосов
/ 17 мая 2018

Я бы порекомендовал вам использовать DI, поскольку он позволяет разрабатывать слабосвязанный код. Через DI вы можете уменьшить тесную связь между программными компонентами. Кроме того, это делает модульное тестирование удобным.

Я бы предложил такой конструктор (как вы упомянули в своем посте)

public MainViewModel(IDialogService dialogService, IChannelObserverService channelObserverService, IInternalBroadcastService internalBroadcastService, 
                         IUserDataAccessService userDataAccessService, IUserService userService)

Но регистрация может быть упрощена как

 SimpleIoc.Default.Register<IDialogService, DialogService>();
 //// Other service registrations.

 SimpleIoc.Default.Register<MainViewModel>(); // without injecting the other dependent types. 

С этим DI потребуется ввести правильные зависимости при создании экземпляра MainViewModel.

Таким образом, с этим вышеописанным подходом вам не нужно разрешать экземпляр внутри вашего кода, так как он уже внедрен в конструктор, поэтому код службы можно упростить до

private void MyMethod()
{
    dialogService.ShowQuestionDialog(abc,abc,abc);
}
...