MVVMLightToolkitをサポートするWPFアプリケーションがあります。アプリケーションには次のシナリオがあります。アプリケーションには2つのデータ接続モードがあります。1つはWCFサービスで、もう1つは直接データベースです。アプリケーションは、上記のモードのいずれかを介してデータベースに接続する必要があります。接続モードの選択は、ログインウィンドウにあります。エンドユーザーは、接続モード(WCFサービスまたは直接データベース)の1つを選択でき、その選択に基づいて、接続構成のリストがコンボボックスに読み込まれます。(詳しくは添付画像をご確認ください)。接続構成は、ローカルxml構成ファイルにあります。また、接続構成のいずれかが選択されている場合に割り当てる必要があるデフォルトの接続構成があります。
ビューモデルロケーターで、デフォルトのサービスを次のように登録しています
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を実装します。
構成ファイルにデフォルトの接続がすでに指定されている場合、ビューモデルロケーターがアプリケーションの開始時にビューモデルを登録すると、上記のコードは正常に機能します。つまり、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
}