【发布时间】:2015-03-15 17:29:29
【问题描述】:
在我们的项目中,我们使用带有 MEF 和 prism 的 .net WPF。 我必须做一些任务,作为其中的一部分,我有不同的模型类,它们都实现了 IModel 接口(我们称它们为 Model1、Model2、Model3)。 对于每个模型类,我需要创建一个视图模型(ViewModel1、ViewModel2、ViewModel3)。 我想用一些通用的方式来做,所以它是可扩展的,如果明天有人会在我不知道的不同 dll 中实现 IModel,我仍然可以为它创建一个视图模型。
我想是这样的:
[InheritedExport]
public interface IViewModelFactory<T>
{
IViewModel Create(string id, IEnumerable<IModel> modelsList);
}
public class ViewModelFactory : IViewModelFactory<Model1>
{
public IViewModel Create(string id, IEnumerable<IModel> modelsList)
{
return new ViewModel1(targetId, modelsList);;
}
}
public class FactoryLocator
{
public static IViewModelFactory<T> GetFactory<T>(T parameters)
{
return ServiceLocator.Current.GetInstance<IViewModelFactory<T>>();
}
}
然后我会这样使用它:
public void CreateAndAddVM(IList<IModel> modelsList)
{
var factory = FactoryLocator.GetFactory(modelsList.FirstOrDefault());
var vm = factory.Create(_id, modelsList);
ViewModels.Add(vm);
}
当我到达 FactoryLocator 时,类型实际上是 IModel 接口,而不是 Model1/2/3。
有没有办法让它以某种方式工作?或者也许是另一种实现此要求的方式?
【问题讨论】:
-
类型参数在编译时解析,并且在编译时您的模型是 IModel 类型,这就是导致问题的原因
-
此时,任何人都可以使用可能不适合它的模型创建视图模型。例如,如果您的 ViewModel 依赖于 Model1,则没有什么能阻止我向您工厂中的
Create方法提供 Model2 列表。这会是个问题吗? -
@MikeEason 是的,现在我明白了。也许您可以提出另一种以可扩展和通用的方式解决它的方法?
-
@RuneFS 也许您可以提出另一种以可扩展和通用的方式解决它的方法?
标签: c# .net wpf generics casting