これは、DDD、TDD、およびリポジトリ/ UnitOfWorkパターンについて多くのことを読んだ後、自分のアプリケーションを作成する最初の試みです。
.NET4.0でEntityFramework、MVC 4を使用しています(このアプリケーションを実行するサーバーはWindows 2003です)
これは基本的な簡略化されたパターンロジックです(元のロジックはIRepository、IUnitOfWork、GenericRepositoryを使用し、IEntityインターフェイスでEF POCOを拡張して、共通IDフィールドへのアクセスを提供します。ただし、この簡略化された例で質問できます)
View -> ViewModel -> Controller <- UnitOfWork <- Repository <- EntityFramework <- Database
意見
Model.Employee.GetSeniority()
EmployeeDetailsViewModel
Employee e { get; set; }
従業員
DateTime dateHired { get; set; }
TimeSpan GetSeniority()
{
return DateTime.Today - dateHired;
}
コントローラーEmployeeDetails()
using(var unitOfWork = new UnitOfWork) {
return View(EmployeeDetailsViewModel model = new EmployeeDetailsViewModel {
e = unitOfWork.GetEmployeRepository().Find(o=>o.id == id)
});
}
UnitOfWork GetEmployeRepository()
return (_employeeRepository ?? _employeeRepository = new EmployeeRepository(this.dbContext));
リポジトリFind()
dbContext.Configuration.EnableProxyCreation = false;
Employee e = dbContext.Employees.Where(expression);
dbContext.Configuration.EnableProxyCreation = true;
return e;
すべてが実際に正しく機能します。問題は、ここで何かがひどく間違っているように感じ、どのレイヤーで修正する必要があるのかわからないことです。
多くの人(こんにちはダリン)から、常にViewModelsをビューに渡し、モデルを渡さないように提案された後、私はこれを始めました。しかし、私がしていること(私は思う)はそれほど良くはありません。モデルをビューモデルにカプセル化するだけです。最初は、Find()メソッドがオブジェクトを取得する前にプロキシをオフにし、永続性を無視するPOCOになるため、それほど悪くはありませんでした。しかし、POCOにロジックを追加したいので、何か問題があるように感じます。
問題は、私のビジネスロジックがどこにあるか、そして私の従業員POCOをDTOオブジェクトにマップする必要があるという事実にあると思います。ただし、どこで従業員POCOをEmployeeDTOに転送する必要がありますか?それはリポジトリ、コントローラー、または他の何かのタスクである必要がありますか?また、ビジネスロジックをどこに配置すればよいかわかりません(例に表示されているGetSeniority()のように単純です)。それは部分的なクラスを介してEFPOCOに追加する必要がありますか、それともDTOに含める必要がありますか?または、Employee-> EmployeeDTO転送に別の欠落しているステップがありますか?