.net - 使用 MVVM 模式在 WPF 中传递和保留连接字符串?

标签 .net wpf mvvm connection-string unity-container

我的应用程序需要能够存储来自登录模块的连接字符串,以供应用程序中的所有其他模块使用,其中大约有 50 个。我最初打算通过广播和订阅新的/更改的连接字符串事件来使连接字符串可用,但是因为大多数/所有 50 个模块都是按需加载的,所以它们无法在登录过程中订阅事件,因为它们是登录过程后加载。根据我的理解,我需要一种不同的方法来使连接字符串可用。

然后我考虑将连接字符串放在 shell 中并尝试将其暴露给任何已加载的模块,但我找不到在不破坏 MVVM 模式和引入不需要的依赖项的情况下执行此操作的方法。

如果有人知道实现上述两个选项中的任何一个的方法,我将很想知道它是否可以在遵循 MVVM 模式的同时完成。

我现在认为最好的方法是将连接字符串的一些单例变体用作共享服务。我希望 Unity 容器能够存储连接字符串,并且我可以使用服务定位器在任何模块中访问它,但我不知道如何执行此操作。 MEF 和/或 Silverlight 中有任何本质上相似的示例。 有没有人在 WPF 中做过这个,或者有一个如何编写连接字符串单例并将其添加到 Unity 容器的示例?指南、教程或一些代码片段将不胜感激!

注意:我在后端使用 Prism 和 Unity、Oracle,应用程序将部署在 Citrix 服务器上(他们以安全的名义阻止开发人员写入应用程序。 config) 这就是为什么我不能使用这种方法的原因。 当多个用户从 Citrix 运行应用程序时,使用 Singleton 作为连接字符串也会导致问题吗?每个用户都会有自己的单例连接字符串吗?如果没有,那么我的整个问题就变了,是否有一种好的方法可以用来在我的所有模块之间传递/保留连接字符串?

最佳答案

如果您使用的是 Prism,我强烈建议使用 Unity Container 注册连接字符串和 ctor-dependency,将其注入(inject)您拥有的各种 VM。

有点像,定义其他程序集/VM 可以使用它的契约,以及 LoginModule 中的实现:

class ConnectionInfo : IConnectionInfo 
{
    public GetConnectionString()
    {
      // you get the drift...!  
      // you should probably cache the result into a Lazy<T> impl. and just return
      // that value on future calls, to save the lookup of the config.
    }
}

在登录模块中注册:

container.RegisterType<IConnectionInfo, ConnectionInfo>(
  new ContainerControlledLifetimeManager());

然后在您的 VM 的 ctor 中对其进行 DI - 在这一点上它是无忧的:

public MyViewModel(IConnectionInfo connectionInfo_)
{
  var connectionString = connectionInfo_.GetConnectionString();
}

我想我对这些情况的首选方法是更喜欢 IEventAggregator 之上的接口(interface),如果我可以选择的话。它只是让处理像延迟创建的虚拟机因为事件信号发生得太早而没有接收到 IEA 信号这样的情况变得更容易。这将导致一些真正痛苦的技术债务积累。

关于.net - 使用 MVVM 模式在 WPF 中传递和保留连接字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15934965/

相关文章:

c# - 如何在 Xamarin 中拍照?

c# - 在 Azure Web App 中调用 gdi32.dll 函数 - 支持吗?

c# - 如何处理纯粹与 View 相关的命令?

c# - 如何在MVVM的上下文中处理DataGrid中的页眉单击事件?

.net - 在 WPF DataGrid 中绑定(bind) ComboBoxColumn 的 ItemsSource

c# - 正则表达式:重复捕获组

wpf - 阻止用户选择/取消选择 WPF DataGrid 中的行

wpf - 密码不是通过PasswordBox.Password 属性泄露的吗?

c# - Mvvmcross:处理全局应用程序事件

html - Kendo Ui控件的MVVM验证