![](/img/trans.png)
[英]Do I need to Separate Business Objects and Business Logic? Asp.net MVC with Repository Pattern in C#
[英]How do implement Unit of Work, Repository and Business Logic in ASP MVC?
我目前被分配到使用實體框架的asp mvc項目。 這將是一個業務線應用程序。 我想使用存儲庫和工作單元模式開發此應用程序。 我是這個模式的新手(也是.net的新手),我在理解模式以及如何實現它時遇到了問題。
我已閱讀了大量文章,我認為這就是我的應用程序應該如何
實體框架 - >存儲庫 - >工作單元 - >客戶端(Asp 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);
}
}
}
工作單元將具有存儲庫,並將在創建時創建DBContext
因此,控制器將在創建時創建工作單元。 要顯示數據,我將使用此代碼
var department = UoW.departmentRepository.Find(1);
return View(department);
當客戶端單擊“保存”按鈕時,我將運行此代碼
UoW.departmentRepository.Update(department);
UoW.Save();
我的問題:
如果從數據檢索到客戶端單擊“保存”按鈕需要數小時,該怎么辦? 據我所知,我們必須盡量縮短背景。
我應該把業務邏輯放在哪里? 我把它放在存儲庫中嗎? 所以我會在保存之前調用UoW.departmentRepository.Validate(部門)。 但是,如果我需要驗證與其他實體相關的實體,該怎么辦? 我是否打電話給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 Layer中的viewmodel處理。
我唯一擔心的是UnitofWork中的dbcontext是公共可訪問的。
我在正確的方向嗎?
如果從數據檢索到客戶端單擊“保存”按鈕需要數小時,該怎么辦? 據我所知,我們必須盡量縮短背景。
這不是問題 - 控制器是按請求實例化的。 用戶查看頁面時不會保留。 聽起來你誤解了控制器實例化的時間。 當您在控制器的構造函數中實例化UnitOfWork時,流程如下所示:
我應該把業務邏輯放在哪里? 我把它放在存儲庫中嗎? 所以我會在保存之前調用UoW.departmentRepository.Validate(部門)。 但是,如果我需要驗證與其他實體相關的實體,該怎么辦? 我是否打電話給UoW.departmentRepository.Validate(課程,部門)?
通常,您的業務邏輯將被抽象為位於Web應用程序和存儲庫之間的單獨層。 向您展示直接注入控制器的存儲庫的教程假設您具有“瘦”業務邏輯。
但是,驗證肯定不是存儲庫的工作。 您應該為每個視圖創建一個單獨的視圖模型,並驗證控制器中的視圖模型。 存儲庫應該僅用於CRUD操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.