2015-01-19 3 views
4

여러 프로젝트로 구성된 솔루션이 있습니다. 프로젝트 중 하나에 모델이 포함되어 있습니다. 다른 뷰 모델에는 ViewModel이 포함되어 있습니다. 모델을 볼 수 모델을 변환하려면상속 모델을보기 모델로 변환

나는 보통 이런 식으로 뭔가를 VM 프로젝트의 확장 메서드를 작성합니다 : 내 프로젝트 그러나

public static BananaVm ToVm(this Banana model) 
{ 
    BananaVm vm = new BananaVm(); 
    vm.Taste = model.Taste; 
    return vm; 
} 

를, 바나나 모델은 과일 모델에서 내 VM에서 상속 프로젝트 나는 과일을 얻는다.

var vm = ((Banana)fruit).ToVm(); 

과 같이보고 : 아래 그림과 같이

그러므로 내가 먼저 과일의 종류를 얻을하지 않는 fruit.ToVm()를 호출하고 .ToVm()를 호출하기 전에에 캐스팅 할 수 아니에요 나는 지금 먼저 올바른 유형을 찾기 위해 스위치를 사용해야합니다, 여러 다른 과일을 가지고 다음 내가 .ToVm()를 호출 할 수있는 후 유형에 과일 캐스팅 - 예를 들면 :

Fruit fruit = FruitService.GetAFruit(); 
switch(fruit.GetType().Name) 
{ 
    case "Banana": 
     return ((Banana)fruit).ToVm(); 
    case "Orange": 
     etc... 
} 

내가 사용하도록 강요하는 switch 문은 나에게 좋은 습관처럼 보이지 않는다. (나는 20 가지가 넘는다. 따라서 20 가지 이상의 경우가 필요합니다.)

누구나 switch 문을 피할 수있는 더 나은 해결책이 있습니까?

Vm 프로젝트에만 모델 프로젝트에 대한 참조가 있으므로 과일 클래스 자체에는 .ToVm 메서드를 추가 할 수 없습니다.

+0

[ "공장 방법 패턴"] (http://en.wikipedia.org/wiki/Factory_method_pattern#C.23)을 사용하는 것이 좋습니다. – SuperOli

+0

@SuperOli 나는 그것을 살펴 봤는데 나는 공장 패턴을 이해하고 있지만 그것이 내 문제를 어떻게 해결하는지 잘 알지 못한다. 정교하게 신경 쓰시겠습니까? – JensOlsen112

+1

과일 용 VM을 만드는 이유는 무엇입니까? 공공 정적 FruitVm ToVm (이 과일 모델) {}; –

답변

0

약간의 코드가 있기 때문에 의견에 답장을 보내고 싶지는 않습니다. 내 직장에서

, 우리가 사용하는 장소의 몇 다음 우리는 그것으로 모든 문제가 없었 :

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); 

나는 그 같은 당신이 찾고 있지만, 정확히 무엇인지 확실하지 않다 이전에 우리는이 패턴을 몇 년 동안 사용해 왔지만 지금은 괜찮습니다.

관련 문제