gpt4 book ai didi

asp.net-mvc - ASP.NET MVC3 - 3 Tier design - 事务控制和业务层设计问题

转载 作者:行者123 更新时间:2023-12-03 03:27:32 26 4
gpt4 key购买 nike

我正在设计一个 ASP.NET MVC3 应用程序,我希望在 3 层架构中实现清晰的关注点分离。我使用 Fluent NHibernate 作为 ORM,即使用 NHibernate 映射的实体的存储库模式。我想添加一个具有工作单元模式的适当业务层,保留 MVC 部分仅用于表示(通过使用通过业务层映射到 nHibernate 实体的 ViewModel)。 This article很好地描述了组合的 3 层和 MVC 架构。

根据这个MVC + unit of work + repository文章我没有看到业务层的明显区别。工作单元类为每个存储库类型提供强类型的 getter,这看起来适合业务层。然而,它公开了一个 Save 方法,我认为该方法将转换为 nHibernate 的 BeginTransaction 和 CommitTransaction 方法。这引出了一些问题:

1) 将事务控制暴露给 MVC 是一个好主意吗?事务控制应该在哪个阶段发生?在我看来,MVC 不应该负责事务,但如何避免呢?

2)是否应该有某种自动方式来处理事务? This ActionFilter implementation是半自动的但是事务控制显然是在MVC部分,不是业务层。

3) UnitOfWork 类与业务层类相同吗?
- 如果是这样,是否意味着我们可以向其中添加自定义业务逻辑方法?
- 如果没有,我们是否用包含业务逻辑方法的其他一些类来包装工作单元?

我很欣赏任何想法或例子。谢谢。

最佳答案

首先,我想澄清关于业务层的一点误解,因为您想使用存储库模式,并且您的设置是 Domain Driven Design 的候选者。 ,那么业务层实际上是[域模型(Entities and Value Objects,您在实体和对象中以面向对象的方式设计业务逻辑),应用程序层协调事务、操作和命令到域层],所以建议的架构将是这样的:

  • 演示文稿 (MVC) [OrderView、OrderPresentationModel、OrderController]
  • 应用程序 [OrderService]
    • 使用 UnitOfWork(事务)和存储库来执行域逻辑
    • DTO [OrderDTO、CustomerDTO]
  • 域名
    • 实体和值对象 [订单、客户、LineItem、地址]
    • 存储库接口(interface) [IOrderRepository、ICustomerRepository]
    • (可选)工作单元接口(interface) [IUnitOfWork]
  • Infrastruction.DataAccess(使用 ORM 或数据访问技术)
    • 存储库 [OrderRepository、CustomerRepository]
    • (可选)工作单元 [UnitOfWork]
  • 基础设施.Common
    • 记录
    • 实用程序

示例场景:

[演示]订单 Controller :

 _orderService.CreateOrder(OrderDTO);

[应用程序]OrderService:

 _unitOfWork.BeginTransaction();
var customer = _customerRepository.GetById(orderDTO.CustomerId);
var order = new Order() { Customer=customer, Price=orderDTO.Price, ... }
_orderRepository.Add(order);
_unitOfWork.Commit();

关于您的问题:

1) 将事务控制暴露给 MVC 是一个好主意吗?事务控制应该在哪个阶段发生?在我看来,MVC 不应该负责事务,但如何避免这种情况?

不,我更愿意将其分离在应用程序层,以便使设计灵活以支持不同的演示。

2)是否应该有某种自动方式来处理事务?这个ActionFilter的实现是半自动的,但是事务控制显然是在MVC部分,而不是业务层。

在应用层使用事务。

3) UnitOfWork 类与业务层类相同吗?- 如果是这样,这是否意味着我们可以向其中添加自定义业务逻辑方法?- 如果没有,我们是否用包含业务逻辑方法的其他一些类来包装工作单元?

不,这只是将任务分组为事务的一种方法。业务逻辑实际上封装在实体中,如果逻辑与一个实体无关,则应在域服务 [TransferService.Transfer(account1, account2, amount)] 中实现,用于协调、访问存储库和应用程序事务层就是这个地方。

关于asp.net-mvc - ASP.NET MVC3 - 3 Tier design - 事务控制和业务层设计问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7772704/

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