Model-View-ViewModel中的适配器

时间:2014-09-18 08:56:39

标签: c# wpf mvvm

我正在使用WPF和MVVM做一个学校项目,我想知道在我的一个模型中是否可以使用适配器,或者我应该在我的ViewModel中执行它?我正在谈论的模型看起来像这样:

public class P2PMeterSession
{
   public P2PMeterAnnounce MeterAnnounce { get; set; }
   public DateTime DisposeTime { get; set; }
   public DateTime GetMimTime { get; set; }
   public DateTime SetTimeTime { get; set; }
   public DateTime LoadProfileLogHackTime { get; set; }
   public List<DateTime> GetConventionalDataTime { get; set; }
   public DateTime GetGsmDataTime { get; set; }
   public Dictionary<DateTime, SessionEvent> Sessionevents { get; set; }

   public P2PMeterSession()
   {
      GetConventionalDataTime = new List<DateTime>();
   }
   public int GetSessionTimeSpan
   {
      get
      {
         var sessionStart = MeterAnnounce.MeterAnnounceTimeStamp;
         var sessionEnd = DisposeTime;
         return (int)(sessionEnd - sessionStart).TotalSeconds;
      }
    }
    public List<KeyValuePair<DateTime, SessionEvent>> ReturnEvents
    {
       get
       {
          List<KeyValuePair<DateTime, SessionEvent>> RE = new List<KeyValuePair<DateTime, SessionEvent>>();
          var AnnounceEvent = MeterAnnounce.MeterAnnounceTimeStamp;
          var DisposeEvent = DisposeTime;
          var GetMimEvent = GetMimTime;
          var SetTimeEvent = SetTimeTime;
          var LoadProfileLogHackTimeEvent = LoadProfileLogHackTime;
          var GetConventionalDataEvent = GetConventionalDataTime;
          var GetGsmDataEvent = GetGsmDataTime;

          RE.Add(new KeyValuePair<DateTime, SessionEvent>(AnnounceEvent, SessionEvent.Announce));
          if (GetMimTime != DateTime.MinValue)
             RE.Add(new KeyValuePair<DateTime, SessionEvent>(GetMimEvent, SessionEvent.GetMim));
          if (SetTimeTime != DateTime.MinValue)
             RE.Add(new KeyValuePair<DateTime, SessionEvent>(SetTimeEvent, SessionEvent.SetTime));
          if (LoadProfileLogHackTime != DateTime.MinValue)
             RE.Add(new KeyValuePair<DateTime, SessionEvent>(LoadProfileLogHackTimeEvent, SessionEvent.LoadProfileLogHack));
          if (GetConventionalDataTime != null)
             GetConventionalDataTime.ForEach(x => RE.Add(new KeyValuePair<DateTime, SessionEvent>(x, SessionEvent.GetConventionalData)));
          if (GetGsmDataTime != DateTime.MinValue)
             RE.Add(new KeyValuePair<DateTime, SessionEvent>(GetGsmDataEvent, SessionEvent.GetGsmData));

           RE.Add(new KeyValuePair<DateTime, SessionEvent>(DisposeEvent, SessionEvent.Dispose));
           return RE;
        }
    }

    public enum SessionEvent 
    { 
       Announce, 
       Dispose, 
       GetMim, 
       SetTime, 
       LoadProfileLogHack, 
       GetConventionalData, 
       GetGsmData
    }
}

1 个答案:

答案 0 :(得分:2)

在使用MVVM时,视图模型应该为其相关视图提供所有相关数据和功能。因此,您可以从视图模型而不是模型类访问任何数据访问服务或适配器,以便他们可以访问数据并在视图中显示它。

虽然有些人可能不同意这一点,但我倾向于使用模型或数据类型类作为数据的“容器”,并且更喜欢在视图模型中公开任何功能。这使我能够将该功能与其他视图模型测试一起作为标准测试。

由于您的项目只是一个学校项目,因此您不太可能为视图模型编写单元测试。但是,如果您是,那么您的适配器可能会干扰测试。如果需要单独测试其中的任何代码,您可以从P2PMeterSession类创建一个接口,并将类型为IP2PMeterSession的属性添加到视图模型中。

在运行应用程序时使用P2PMeterSession的实际实例填充此属性,并在测试期间使用MockP2PMeterSession类填充此属性。 MockP2PMeterSession类可以返回预设数据,甚至可以根据您的测试返回任何数据。