我有一个工厂方法的代码来产生单子。我有一个小型毛伊岛应用程序,并希望拥有持久的全球数据。
public static class FactoryService
{
private static BudgetViewModel budgetViewModelInstance;
private static AccountsViewModel accountsViewModelInstance;
private static PayeesViewModel payeesViewModelInstance;
public static BaseViewModel BuildViewModel(Type type)
{
if(type == typeof(BudgetViewModel))
{
budgetViewModelInstance ??= new BudgetViewModel();
return budgetViewModelInstance;
}
else if(type == typeof(AccountsViewModel))
{
accountsViewModelInstance ??= new AccountsViewModel();
return accountsViewModelInstance;
}
else if(type == typeof(PayeesViewModel))
{
payeesViewModelInstance ??= new PayeesViewModel();
return payeesViewModelInstance;
}
else
{
throw new Exception($"Can't build View Model. Invalid View Model: {type}");
}
}
}然后,当我想要一个视图模型引用时,我必须在调用BuildViewModel之前转换我想要的类型:
BudgetViewModel budgetViewModel = (BudgetViewModel)FactoryService.BuildViewModel(typeof(BudgetViewModel));这是..。对吗?有什么更好的方法来实现这一点吗?我不能为视图模型使用静态类,因为它们必须从ObservableObject继承。(摘自社区MVVM工具包)
发布于 2022-11-19 01:24:13
我会用仿制药。就像这样:
public static class FactoryService
{
private static BudgetViewModel budgetViewModelInstance;
private static AccountsViewModel accountsViewModelInstance;
private static PayeesViewModel payeesViewModelInstance;
private static readonly object _lock = new object();
public static T BuildViewModel<T>() where T : BaseViewModel, new()
{
if (typeof(T) == typeof(BudgetViewModel))
{
if (budgetViewModelInstance == null)
{
lock (_lock)
{
if (budgetViewModelInstance == null)
{
budgetViewModelInstance = new();
}
}
}
return budgetViewModelInstance as T;
}
else if (typeof(T) == typeof(AccountsViewModel))
{
if (accountsViewModelInstance == null)
{
lock (_lock)
{
if (accountsViewModelInstance == null)
{
accountsViewModelInstance = new();
}
}
}
return accountsViewModelInstance as T;
}
else if (typeof(T) == typeof(PayeesViewModel))
{
if (payeesViewModelInstance == null)
{
lock (_lock)
{
if (payeesViewModelInstance == null)
{
payeesViewModelInstance = new();
}
}
}
return payeesViewModelInstance as T;
}
else
{
throw new Exception($"Can't build View Model. Invalid View Model: {typeof(T)}");
}
}
}然后您可以像这样调用:var viewModel = FactoryService.BuildViewModel<BudgetViewModel>();
https://stackoverflow.com/questions/74496783
复制相似问题