私は現在、エンティティ フレームワークを使用して asp mvc プロジェクトに割り当てられています。これは基幹業務アプリケーションになります。リポジトリと作業単位パターンを使用してこのアプリを開発したいと考えています。私はこのパターンが初めてで (.net も初めて)、パターンとその実装方法を理解するのに問題があります。
私は数多くの記事を読みましたが、これが私のアプリケーションのあり方だと思います
Entity Framework -> リポジトリ -> 作業単位 -> クライアント (Asp MVC)
この記事からいくつかのコードを添付し ます http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-the-repository-and-unit-of-work-patterns-in -an-asp-net-mvc-アプリケーション
using System;
using ContosoUniversity.Models;
namespace ContosoUniversity.DAL
{
public class UnitOfWork : IDisposable
{
private SchoolContext context = new SchoolContext();
private GenericRepository<Department> departmentRepository;
private GenericRepository<Course> courseRepository;
public GenericRepository<Department> DepartmentRepository
{
get
{
if (this.departmentRepository == null)
{
this.departmentRepository = new GenericRepository<Department>(context);
}
return departmentRepository;
}
}
public GenericRepository<Course> CourseRepository
{
get
{
if (this.courseRepository == null)
{
this.courseRepository = new GenericRepository<Course>(context);
}
return courseRepository;
}
}
public void Save()
{
context.SaveChanges();
}
private bool disposed = false;
protected virtual void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
context.Dispose();
}
}
this.disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
}
Unit of Work にはリポジトリがあり、作成時に DBContext が作成されます
そのため、コントローラーは作成時に作業単位を作成します。データを表示するには、このコードを使用します
var department = UoW.departmentRepository.Find(1);
return View(department);
クライアントが保存ボタンをクリックすると、このコードが実行されます
UoW.departmentRepository.Update(department);
UoW.Save();
私の質問:
データの取得からクライアントが保存ボタンをクリックするまでに何時間もかかる場合はどうでしょうか。私が知っている限りでは、コンテキストをできるだけ短く保つ必要があります。
ビジネス ロジックはどこに配置すればよいですか。リポジトリに入れますか?したがって、保存する前に UoW.departmentRepository.Validate(department) を呼び出します。しかし、他のエンティティに関連するエンティティを検証する必要がある場合はどうでしょうか。UoW.departmentRepository.Validate(コース、部門) を呼び出しますか?
この種のアプリケーション用の完全なサンプル プロジェクトはありますか?
編集
Ant P がアドバイスしたように、ビジネス ロジックを配置するために別のレイヤーを追加する必要があります。
これは私がこれまでに来たものです
作業単位:
public class UnitOfWork : IDisposable
{
private DBContext _context = new DBContext();
public DBContext Context
{
get
{
return this._context;
}
}
public void Save()
{
_context.SaveChanges();
}
private bool disposed = false;
protected virtual void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
context.Dispose();
}
}
this.disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
ビジネスの論理:
public class SalesBusinessLogic : IDisposable
{
private ICustomerRepository _customerRepo;
private ISalesRepository _salesRepo;
private UnitOfWork _uow;
public SalesBusinessLogic(UnitOfWork uow)
{
this._uow = uow;
}
public ICustomerRepository CustomerRepo
{
get
{
if (this._customerRepo == null)
{
this._customerRepo = new CustomerRepository(this._uow);
}
return this._customerRepo;
}
}
public ISalesRepository SalesRepo
{
get
{
if (this._salesRepo == null)
{
this._salesRepo = new SalesRepository(this._uow);
}
return this._salesRepo;
}
}
public bool Validate(Sales sales)
{
//this is where validation performed
return true;
}
}
コントローラ:
public SalesController : Controller
{
private UnitOfWork _uow = new UnitOfWork();
private SalesBusinessLogic _bl = new SalesBusinessLogic(this._uow);
public ActionResult Index()
{
var sales = _bl.SalesRepo.Find(1);
sales.CustomerID = 1;
if _bl.Validate(sales)
{
_bl.SalesRepo.Update(sales);
_uow.Save();
}
return View(sales);
}
}
ここで、UnitOfWork は、ビジネス ロジックとリポジトリによって消費される dbcontext のプロバイダーとしてのみ機能します。リポジトリは BusinessLogic クラスになります。
サーバー側の検証は BusinessLogic によって処理され、クライアント側の検証は Web レイヤーのビューモデルによって処理されます。
私の唯一の懸念は、UnitofWork の dbcontext が公開されていることです。
私はここで正しい方向にいますか?