更改MVVM Light中接口的实现

时间:2020-07-29 15:32:13

标签: c# dependency-injection

我目前面临与使用MVVM Light框架进行依赖注入有关的问题。假设我有一个名为ISearchEngine的接口,并且希望能够在运行时更改实现。

switch (value)
{
case "Google":
    SimpleIoc.Default.Unregister<ISearchEngine>();
    SimpleIoc.Default.Register<ISearchEngine, GoogleSearchEngine>();

    break;

case "Bing":
    SimpleIoc.Default.Unregister<ISearchEngine>();
    SimpleIoc.Default.Register<ISearchEngine, BingSearchEngine>();

    break;

default:
    throw new ArgumentOutOfRangeException("Unknown search engine");
}

我已经实现了构造器注入,如下所示:

private ISearchEngine _searchEngine;        

public SearchViewModel(ISearchEngine searchEngine)
{
    _searchEngine = searchEngine;
}

我的定位器类别:

public class ViewModelLocator
{
    /// <summary>
    /// Initializes a new instance of the ViewModelLocator class.
    /// </summary>
    static ViewModelLocator()
    {
        ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
        SimpleIoc.Default.Register<ISearchEngine, BingSearch>();

        SimpleIoc.Default.Register<SearchViewModel>(true);
        SimpleIoc.Default.Register<MainViewModel>(true);
        // ... Other ViewModels
    }

    public MainViewModel MainVM { get { return ServiceLocator.Current.GetInstance<MainViewModel>(); } }
    public SearchViewModel SearchVM { get { return ServiceLocator.Current.GetInstance<SearchViewModel>(); } }

    // ... Other ViewModels


    public static void Cleanup()
    {
        // TODO Clear the ViewModels
    }
}}

SearchView.xaml:

<UserControl
...
    d:DataContext="{Binding SearchVM, Source={StaticResource Locator}}"
....
</UserControl

在如上所述的另一个ViewModel中更改ISearchEngine的实现不会影响_searchEngine中的本地实例SearchViewModel。它仍然代表初始_searchEngine实例。像这样的场注入

private ISearchEngine _searchEngine { get { return SimpleIoc.Default.GetInstance<ISearchEngine>(); } }

工作正常,但据我所知,应避免使用场注入。有没有机会使用构造函数注入并在运行时动态更改实现?

0 个答案:

没有答案