C# 模型视图ViewModel中的适配器

C# 模型视图ViewModel中的适配器,c#,wpf,mvvm,C#,Wpf,Mvvm,我正在使用WPF和MVVM做一个学校项目,我想知道在我的一个模型中安装适配器是否合适,还是应该在ViewModel中安装?我所说的模型是这样的: public class P2PMeterSession { public P2PMeterAnnounce MeterAnnounce { get; set; } public DateTime DisposeTime { get; set; } public DateTime GetMimTime { get; set; }

我正在使用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
    }
}
公共类P2PMeterSession
{
公共P2pMeterAnnounceMeteranNounce{get;set;}
公共日期时间处理时间{get;set;}
公共日期时间GetMimTime{get;set;}
public DateTime SetTimeTime{get;set;}
公共日期时间LoadProfileLogHackTime{get;set;}
公共列表GetConventionalDataTime{get;set;}
public DateTime GetGsmDataTime{get;set;}
公共字典会话事件{get;set;}
公共会话()
{
GetConventionalDataTime=新列表();
}
公共int GetSessionTimeSpan
{
得到
{
var sessionStart=MeterAnnounce.MeterAnnounceTimeStamp;
var sessionEnd=处置时间;
return(int)(sessionEnd-sessionStart).TotalSeconds;
}
}
公众活动列表
{
得到
{
List RE=新列表();
var AnnounceEvent=MeterAnnounce.MeterAnnounceTimeStamp;
var DisposeEvent=处置时间;
var GetMimEvent=GetMimTime;
var SetTimeEvent=SetTimeTime;
var LoadProfileLogHackTimeEvent=LoadProfileLogHackTime;
var GetConventionalDataEvent=GetConventionalDataTime;
var GetGsmDataEvent=GetGsmDataTime;
关于添加(新的KeyValuePair(AnnounceEvent,SessionEvent.Announce));
if(GetMimTime!=DateTime.MinValue)
关于添加(新的KeyValuePair(GetMimEvent,SessionEvent.GetMim));
if(SetTimeTime!=DateTime.MinValue)
添加(新的KeyValuePair(SetTimeEvent,SessionEvent.SetTime));
if(LoadProfileLogHackTime!=DateTime.MinValue)
添加(新的KeyValuePair(LoadProfileLogHackTimeEvent,SessionEvent.LoadProfileLogHack));
if(GetConventionalDataTime!=null)
ForEach(x=>RE.Add(新的KeyValuePair(x,SessionEvent.GetConventionalData));
if(GetGsmDataTime!=DateTime.MinValue)
添加(新的KeyValuePair(GetGsmDataEvent,SessionEvent.GetGsmData));
关于添加(新的KeyValuePair(disposeeEvent,SessionEvent.Dispose));
返回RE;
}
}
公共枚举会话事件
{ 
宣布
处置
格特姆,
设定时间,
LoadProfileLogHack,
获取常规数据,
GetGsmData
}
}

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

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

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


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

查看TDD并使用一个接口来实现此目的。谢谢,这真的很有帮助:)