我有一个支持MVVM Light Toolkit的WPF应用程序。该应用程序具有以下方案。 该应用程序有两种数据连接模式。一个是 WCF服务,另一个是直接数据库。应用程序应通过上述模式之一连接到数据库。连接模式选择位于登录窗口中。最终用户可以选择其中一种连接模式(WCF服务或直接数据库),并根据该选择在组合框中加载连接配置列表。 (有关更多信息,请查看附图)。连接配置位于本地xml配置文件中。此外,我还有一个默认连接配置,如果选择了任何连接配置,则应分配该配置。
在View Model Locator中,我正在注册默认服务,如下所示
public ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
if (ViewModelBase.IsInDesignModeStatic)
{
// Create design time view services and models
if (!SimpleIoc.Default.IsRegistered<IDataService>())
SimpleIoc.Default.Register<IDataService, MockDataClient>();
}
else
{
// Create run time view services and models
if (!SimpleIoc.Default.IsRegistered<IDataService>())
{
switch (DefaultConnectionConfiguration.ConnectionMode)
{
case DataConnectionMode.WcfService:
var wcfServiceConfiguration = (WcfServiceConfiguration)CurrentConnectionConfiguration;
SimpleIoc.Default.Register<IDataService>(
() =>
wcfServiceConfiguration != null
? new DataServiceClient("WSHttpBinding_IDataService",
wcfServiceConfiguration.EndpointUrl)
: null);
break;
case DataConnectionMode.Database:
SimpleIoc.Default.Register<IDataService, DbClient>();
break;
}
}
}
SimpleIoc.Default.Register<LoginViewModel>();
SimpleIoc.Default.Register<ManageConfigurationsViewModel>();
DbClient和DataServiceClient都实现IDataservice 。
如果配置文件中已经指定了默认连接,则当视图模型定位器在应用程序start.ie注册视图模型时,上述代码可以正常工作。使用默认连接配置注册IDataservice。
现在真正的问题是当用户选择连接配置时,该连接配置成为默认配置,我希望MVVM Light取消注册以前的数据服务并注册新选择的数据服务,并使用它连接到数据
我在登录按钮单击中尝试了以下代码,但失败了:(
void SignInButtonClick()
{
if(SimpleIoc.Default.IsRegistered<IDataService>())
SimpleIoc.Default.Unregister<IDataService>();
switch (DefaultConnectionConfiguration.ConnectionMode)
{
case DataConnectionMode.WcfService:
var wcfServiceConfiguration = (WcfServiceConfiguration)CurrentConnectionConfiguration;
SimpleIoc.Default.Register<IDataService>(
() =>
wcfServiceConfiguration != null
? new DataServiceClient("WSHttpBinding_IDataService",
wcfServiceConfiguration.EndpointUrl)
: null);
break;
case DataConnectionMode.Database:
SimpleIoc.Default.Register<IDataService, DbClient>();
break;
}
//perform authentication process
}
更新代码
public class ViewModelLocator
{
public ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
if (ViewModelBase.IsInDesignModeStatic)
{
// Create design time view services and models
if (!SimpleIoc.Default.IsRegistered<IDataService>())
SimpleIoc.Default.Register<IDataService, MockDataClient>();
}
SimpleIoc.Default.Register<LoginViewModel>();
}
public LoginViewModel LoginViewModel
{
get
{
return ServiceLocator.Current.GetInstance<LoginViewModel>();
}
}
public static void Cleanup()
{
// TODO Clear the ViewModels
ServiceLocator.Current.GetInstance<LoginViewModel>().Cleanup();
}
}
public class LoginViewModel : ViewModelBase
{
ICometDataService service;
#region Constructor
public LoginViewModel()
{
}
public LoginViewModel(IDataService dataService)
: base(dataService)
{
service = dataService;
}
#endregion
}
答案 0 :(得分:1)
我只是删除:
if (!SimpleIoc.Default.IsRegistered<IDataService>())
{
switch (DefaultConnectionConfiguration.ConnectionMode)
{
case DataConnectionMode.WcfService:
var wcfServiceConfiguration = (WcfServiceConfiguration)CurrentConnectionConfiguration;
SimpleIoc.Default.Register<IDataService>(
() =>
wcfServiceConfiguration != null
? new DataServiceClient("WSHttpBinding_IDataService",
wcfServiceConfiguration.EndpointUrl)
: null);
break;
case DataConnectionMode.Database:
SimpleIoc.Default.Register<IDataService, DbClient>();
break;
}
}
从ViewModelLocator 并将SignInButtonClick中的代码更改为:
void SignInButtonClick()
{
switch (DefaultConnectionConfiguration.ConnectionMode)
{
case DataConnectionMode.WcfService:
var wcfServiceConfiguration = (WcfServiceConfiguration)CurrentConnectionConfiguration;
SimpleIoc.Default.Register<IDataService>(
() =>
wcfServiceConfiguration != null
? new DataServiceClient("WSHttpBinding_IDataService",
wcfServiceConfiguration.EndpointUrl)
: null);
break;
case DataConnectionMode.Database:
SimpleIoc.Default.Register<IDataService, DbClient>();
break;
}
//perform authentication process
}
通过这样做,您只需注册一次服务,即可保证您注册的界面正确。