9

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
}
4

1 に答える 1

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
}

これにより、サービスを 1 回登録するだけで、正しいインターフェイスを登録していることを保証できます。

于 2012-12-07T09:44:53.650 に答える