我正在使用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
}
}
答案 0 :(得分:2)
在使用MVVM时,视图模型应该为其相关视图提供所有相关数据和功能。因此,您可以从视图模型而不是模型类访问任何数据访问服务或适配器,以便他们可以访问数据并在视图中显示它。
虽然有些人可能不同意这一点,但我倾向于使用模型或数据类型类作为数据的“容器”,并且更喜欢在视图模型中公开任何功能。这使我能够将该功能与其他视图模型测试一起作为标准测试。
由于您的项目只是一个学校项目,因此您不太可能为视图模型编写单元测试。但是,如果您是,那么您的适配器可能会干扰测试。如果需要单独测试其中的任何代码,您可以从P2PMeterSession
类创建一个接口,并将类型为IP2PMeterSession
的属性添加到视图模型中。
在运行应用程序时使用P2PMeterSession
的实际实例填充此属性,并在测试期间使用MockP2PMeterSession
类填充此属性。 MockP2PMeterSession
类可以返回预设数据,甚至可以根据您的测试返回任何数据。