gpt4 book ai didi

c# - 如何在 ASP MVC 中实现工作单元、存储库和业务逻辑?

转载 作者:太空狗 更新时间:2023-10-29 21:17:50 26 4
gpt4 key购买 nike

我目前被分配到一个使用 Entity Framework 的 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-application

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

因此 Controller 将在创建时创建工作单元。要显示数据,我将使用此代码

var department = UoW.departmentRepository.Find(1);
return View(department);

当客户端点击保存按钮时,我将运行这段代码

UoW.departmentRepository.Update(department);
UoW.Save();

我的问题:

  1. 如果从数据检索到客户点击保存按钮需要数小时怎么办?据我所知,我们必须使上下文尽可能简短。

  2. 我应该把业务逻辑放在哪里?我把它放在存储库中吗?所以我会在保存之前调用 UoW.departmentRepository.Validate(department) 。但是,如果我需要验证与其他实体相关的实体怎么办。我调用 UoW.departmentRepository.Validate(course, department) 吗?

这种应用有完整的示例工程吗?

编辑

按照 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;
}
}

Controller :

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 层中的 View 模型处理。

我唯一担心的是 UnitofWork 中的 dbcontext 是可公开访问的。

我的方向对吗?

最佳答案

What if it takes hours from data retrieval until the client click save button. From what i know, we have to keep context as short as possible.

这不是问题 - Controller 是根据请求实例化的。当用户查看页面时,它不会持续存在。听起来您误解了 Controller 在什么时候被实例化。当您在 Controller 的构造函数中实例化 UnitOfWork 时,流程如下所示:

  • 用户发出 POST 请求(通过单击“保存”)。
  • 请求到达服务器并实例化 Controller (从而实例化工作单元)。
  • 调用 Action 方法。
  • 工作单元已部署。

Where should i put business logic? Do i put it in repository? So i would call UoW.departmentRepository.Validate(department) before save. But then, what if i need to validate entity which relate to other entity. Do i call UoW.departmentRepository.Validate(course, department)?

通常,您的业务逻辑将被抽象到一个单独的层中,该层位于您的 Web 应用程序和存储库之间。向您展示直接注入(inject) Controller 的存储库的教程假定您具有“瘦”业务逻辑。

但是,验证绝对不是存储库的工作。您应该为每个 View 创建一个单独的 View 模型,并在您的 Controller 中验证它们。该存储库应该几乎完全用于 CRUD 操作。

关于c# - 如何在 ASP MVC 中实现工作单元、存储库和业务逻辑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18885562/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com