我正在重构和构建 Win8 应用解决方案。我一直在将我的关键组件分离到他们自己的项目中。我有:
- 使用 MVVMLight(以及 SimpleIOC)的主要 Win8 项目
- 一个包含我所有可序列化模型类的模型项目
- 具有用于导航和序列化的各种类的服务项目
- 我所有接口的合同项目
- 包含主应用程序使用的视图模型的视图模型项目。
到目前为止,我已经完成了一些工作,但是有一个案例我无法制定出最佳结构。在我的 ViewModels 项目中,我有一个数据映射器类。基本上它接受一个模型并吐出一个视图模型。我一直在尝试将其移至服务层并为其创建一个接口,但在接口中遇到了一个依赖关系以了解 ViewModel 类,因此目前基本上具有循环依赖关系。
编辑:我应该解释一下 ViewModels 本身需要使用这个映射器。例如,我有一个包含 XAML 页面所需的所有内容的整体 PageViewModel。其中之一是 VehicleViewModels 列表,它是包含一些视图特定属性的车辆列表。因此,PageViewModel 将调用数据服务,获取 Vehicle 模型,然后使用映射器将其转换为 VehicleViewModel。
这里是界面。
namespace MyApp.Contracts
{
public interface IDataMapperService
{
VehicleViewModel VehicleToVehicleViewModel(Vehicle v);
TripViewModel TripToTripViewModel(Trip t);
}
}
如您所见,我想从这两种方法中返回一个 ViewModel 对象。但是 ViewModel 项目已经引用了这个 Contracts 项目,所以我目前不会构建。
我玩弄了为视图模型创建和接口的想法,但是我需要做很多工作来创建接口,我不确定这是最好的方法。我在这里忽略了一些明显的东西吗?
编辑:这是当前接口的实际实现:
public VehicleViewModel VehicleToVehicleViewModel(Vehicle v)
{
var newVehicle = new VehicleViewModel(v.VehicleID, v.Make, v.Model, v.Petrol, v.Registration);
foreach (Trip t in v.Trips)
{
newVehicle.Trips.Add(TripToTripViewModel(t));
}
IQueryable<Trip> trips = v.Trips.AsQueryable();
var now = DateTime.Now.Date;
var firstofmonth = new DateTime(now.Year, now.Month, 1);
while (now.DayOfWeek != DayOfWeek.Monday) now = now.AddDays(-1);
var weektrips = from t in trips
where t.Date >= now
select t;
var monthtrips = from t in trips
where t.Date >= firstofmonth
select t;
newVehicle.TripsThisWeek = weektrips.Count();
newVehicle.MilesThisWeek = (int)Math.Round(weektrips.Sum(t => t.Mileage), 0);
newVehicle.TripsThisMonth = monthtrips.Count();
newVehicle.MilesThisMonth = (int)Math.Round(monthtrips.Sum(t => t.Mileage), 0);
return newVehicle;
}
public TripViewModel TripToTripViewModel(Trip t)
{
var newTrip = new TripViewModel(t.TripID, t.Date, t.Mileage);
return newTrip;
}