如何确保 View Model Base class 只有一个实例?
How can one ensure only one instance of a View Model Base class?
我一直在构建 WPF 应用程序。到目前为止,大多数 ViewModel 都严格按照自己的代码工作。
我最近决定创建一个基础 class "ApplicationViewModel
" 将公共代码迁移到其中。在大多数情况下,这工作正常,但我 运行 遇到了一个我遇到困难的问题。
我的继承视图模型似乎正在生成它们自己的这个基本视图模型的实例。因此;如果 ClassA 中的方法更改基类 class 中的变量,则 ClassB 仍会将完全相同的变量注册为 null,或者它以前的值是什么。
最初我认为在微软的Unity容器中注册实例可以解决问题,
public App()
{
Container.RegisterType<ApplicationViewModel>(new ContainerControlledLifetimeManager());
}
但这并没有改变什么。
经过研究,我发现的明显答案是将 class 设为静态,但在我开始这条路线之前,我更喜欢另一种解决方案。我的程序功能太多可能需要返工。
我不确定单例实例 属性 是否可以使用基础 class 声明。
所以我想我的问题是:如何确保在我的所有 ViewModel 中使用此视图模型基础 class 的相同实例?
如果您的视图模型确实(在技术上)继承自基础 class,则每个继承视图模型的实例都需要一个基础实例 class。
您可以通过创建一个静态 class(或单例实例)来解决您的问题,它存储这些值,这些值对于所有现有的视图模型应该是相等的。
您的基础 class 仍然可以包含 non-static 访问器(get-/set 方法),它们使用这些静态变量。实际上,您的视图模型不需要知道值的存储位置。
实际上,这非常接近于在 non-static base-class 中定义一些 fields/properties 静态。所以也许这也是一个选择。
抱歉,但是没有办法让派生 class 的不同实例与基础 class 的一个实例相同。
我可以建议下一个设计。在基础 class 中创建一个字段:
private static Dictionary<string, object> _hash = new Dictionary<string, object>
并在基 class 中为派生 classes 创建受保护的属性:
protected string Title {
get {
string value;
ApplicationViewModel._hash.TryGetValue("Title", out value);
return value;
}
set {
ApplicationViewModel._hash["Title"] = value;
}
}
我希望这会适合你。
How would I ensure the same instance of this viewmodel base class is used throughout all my ViewModels?
不可能。基础 class 是从它继承的 class 定义的一部分,即基础 class 和派生 class 是同一实例的一部分。当您创建派生 class 的实例时,只会创建该类型的单个实例。基类型是这种类型的一部分。
如果您只想要基础的单个实例 class 围绕继承不是解决方案。
相反,您可以使用来自每个子视图模型的 Container
获取对共享视图模型对象的引用:
public class ChildViewModel //doesn't inhert from the base view model
{
public ChildViewModel()
{
var sharedViewModel = Container.Resolve<ApplicationViewModel>();
//call any properties or methods of the sharedViewModel...
}
}
我一直在构建 WPF 应用程序。到目前为止,大多数 ViewModel 都严格按照自己的代码工作。
我最近决定创建一个基础 class "ApplicationViewModel
" 将公共代码迁移到其中。在大多数情况下,这工作正常,但我 运行 遇到了一个我遇到困难的问题。
我的继承视图模型似乎正在生成它们自己的这个基本视图模型的实例。因此;如果 ClassA 中的方法更改基类 class 中的变量,则 ClassB 仍会将完全相同的变量注册为 null,或者它以前的值是什么。
最初我认为在微软的Unity容器中注册实例可以解决问题,
public App()
{
Container.RegisterType<ApplicationViewModel>(new ContainerControlledLifetimeManager());
}
但这并没有改变什么。
经过研究,我发现的明显答案是将 class 设为静态,但在我开始这条路线之前,我更喜欢另一种解决方案。我的程序功能太多可能需要返工。
我不确定单例实例 属性 是否可以使用基础 class 声明。
所以我想我的问题是:如何确保在我的所有 ViewModel 中使用此视图模型基础 class 的相同实例?
如果您的视图模型确实(在技术上)继承自基础 class,则每个继承视图模型的实例都需要一个基础实例 class。
您可以通过创建一个静态 class(或单例实例)来解决您的问题,它存储这些值,这些值对于所有现有的视图模型应该是相等的。
您的基础 class 仍然可以包含 non-static 访问器(get-/set 方法),它们使用这些静态变量。实际上,您的视图模型不需要知道值的存储位置。
实际上,这非常接近于在 non-static base-class 中定义一些 fields/properties 静态。所以也许这也是一个选择。
抱歉,但是没有办法让派生 class 的不同实例与基础 class 的一个实例相同。
我可以建议下一个设计。在基础 class 中创建一个字段:
private static Dictionary<string, object> _hash = new Dictionary<string, object>
并在基 class 中为派生 classes 创建受保护的属性:
protected string Title {
get {
string value;
ApplicationViewModel._hash.TryGetValue("Title", out value);
return value;
}
set {
ApplicationViewModel._hash["Title"] = value;
}
}
我希望这会适合你。
How would I ensure the same instance of this viewmodel base class is used throughout all my ViewModels?
不可能。基础 class 是从它继承的 class 定义的一部分,即基础 class 和派生 class 是同一实例的一部分。当您创建派生 class 的实例时,只会创建该类型的单个实例。基类型是这种类型的一部分。
如果您只想要基础的单个实例 class 围绕继承不是解决方案。
相反,您可以使用来自每个子视图模型的 Container
获取对共享视图模型对象的引用:
public class ChildViewModel //doesn't inhert from the base view model
{
public ChildViewModel()
{
var sharedViewModel = Container.Resolve<ApplicationViewModel>();
//call any properties or methods of the sharedViewModel...
}
}