Win8 アプリ ソリューションのリファクタリングと構造化を行っています。私は主要なコンポーネントを独自のプロジェクトに分けてきました。私は持っている:
- MVVMLight (したがって SimpleIOC) を使用するメインの Win8 プロジェクト
- すべてのシリアル化可能なモデル クラスを含むモデル プロジェクト
- ナビゲーションとシリアル化のためのさまざまなクラスを持つサービス プロジェクト
- すべてのインターフェイスのコントラクト プロジェクト
- メイン アプリで使用されるビュー モデルを含むビュー モデル プロジェクト。
これまでのところ、うまく機能していますが、最適な構造を見つけられないケースが 1 つあります。私の ViewModels プロジェクト内には、データ マッパー クラスがあります。基本的に、モデルを取り込み、ビュー モデルを吐き出します。これをサービスレイヤーに移動しようとして、そのためのインターフェイスを作成しましたが、ViewModel クラスの知識のためにインターフェイス内で依存関係に遭遇したため、現時点では基本的に循環依存関係があります。
編集: ViewModels 自体がこのマッパーを利用する必要があることを説明する必要があります。たとえば、XAML ページに必要なすべてを保持する全体的な PageViewModel があります。これらの 1 つは、いくつかのビュー固有のプロパティを含む車両のリストである VehicleViewModels のリストです。したがって、PageViewModel はデータ サービスを呼び出し、Vehicle モデルを取得し、マッパーを使用してこれを VehicleViewModel に変換します。
これがインターフェースです。
namespace MyApp.Contracts
{
public interface IDataMapperService
{
VehicleViewModel VehicleToVehicleViewModel(Vehicle v);
TripViewModel TripToTripViewModel(Trip t);
}
}
ご覧のとおり、2 つのメソッドから 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;
}