我目前面临与使用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>(); } }
工作正常,但据我所知,应避免使用场注入。有没有机会使用构造函数注入并在运行时动态更改实现?