MVVMLight Simple IOC - 动态注册和取消注册数据服务实现

时间:2012-12-06 06:22:10

标签: c# wpf design-patterns mvvm mvvm-light

我有一个支持MVVM Light Toolkit的WPF应用程序。该应用程序具有以下方案。 该应用程序有两种数据连接模式。一个是 WCF服务,另一个是直接数据库。应用程序应通过上述模式之一连接到数据库。连接模式选择位于登录窗口中。最终用户可以选择其中一种连接模式(WCF服务或直接数据库),并根据该选择在组合框中加载连接配置列表。 (有关更多信息,请查看附图)。连接配置位于本地xml配置文件中。此外,我还有一个默认连接配置,如果选择了任何连接配置,则应分配该配置。

enter image description here

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

1 个答案:

答案 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
}

通过这样做,您只需注册一次服务,即可保证您注册的界面正确。