我找到了一个由多个项目组成的解决方案。其中一个项目包含模型。另一个包含(并使用) ViewModels。
为了将模型转换为查看模型,我通常会在VM项目中编写一个扩展方法,如下所示:
public static BananaVm ToVm(this Banana model)
{
BananaVm vm = new BananaVm();
vm.Taste = model.Taste;
return vm;
}然而,在我的项目中,香蕉模型继承了水果模型,而在我的VM项目中,我收到了一个水果。
因此,除非首先获得水果的类型并将其转换为fruit.ToVm(),否则我无法调用.ToVm(),如下所示:
var vm = ((Banana)fruit).ToVm();考虑到我获得了多个不同的水果,我现在必须使用一个开关来首先找到正确的类型,然后将其转换为可以调用.ToVm()的类型--例如:
Fruit fruit = FruitService.GetAFruit();
switch(fruit.GetType().Name)
{
case "Banana":
return ((Banana)fruit).ToVm();
case "Orange":
etc...
}我觉得被迫使用的开关语句对我来说似乎不是一个很好的练习(我得到了20多个不同的水果,因此需要20多个案例)。
有没有人有更好的解决方案可以避免开关语句?
注意,我不能在水果类本身中添加一个.ToVm方法,因为只有Vm项目有一个模型项目的引用。
发布于 2015-01-20 15:10:16
请注意,我不想回复评论,因为我有一些代码。
在我的工作场所,我们使用以下几个地方,我们从来没有任何问题:
public class Factory
{
public static FruitVM GetFruitVM(Fruit fruit)
{
if (fruit == null)
throw new ArgumentNullException("fruit");
if (fruit is Banana)
return new BananaVM((Banana)fruit);
if (fruit is Orange)
return new OrangeVM((Orange)fruit);
throw new NotImplementedException(string.Format("The Factory doesn't carry this fruit {0}!", fruit.ToString()));
}
}
// Usage example
Banana banana = GetBananaModelSomehow();
FruitVM fruitVM = Factory.GetFruitVM(banana);我不知道这是不是你想要的,但就像我之前说过的,我们已经使用这个模式好几年了,这对我们来说很好。
https://stackoverflow.com/questions/28033945
复制相似问题