Asp.net mvc ASP.NET MVC3-三层设计-事务控制和业务层设计问题
我正在设计一个ASP.NET MVC3应用程序,我希望在3层体系结构中明确区分关注点。我使用Fluent NHibernate作为ORM,这是一种存储库模式,用于处理NHibernate映射的实体。我想添加一个带有工作单元模式的适当业务层,保持MVC部分仅用于表示(通过使用通过业务层映射到nHibernate实体的ViewModels)。很好地描述了组合的3层和MVC体系结构 根据本文,我看不到业务层的明确区别。工作单元类为每种存储库类型提供强类型的getter,这看起来适合于业务层。然而,它公开了一个Save方法,我认为这将转化为使用nHibernate的BeginTransaction和CommitTransaction方法。这就引出了一些问题: 1) 将事务控制公开给MVC是一个好主意吗?事务控制应该在哪个阶段发生?在我看来,MVC不应该对事务负责,但如何避免呢 2) 是否应该有一些自动处理事务的方法?是半自动的,但事务控制显然在MVC部分,而不是业务层 3) UnitOfWork类与业务层类相同吗?Asp.net mvc ASP.NET MVC3-三层设计-事务控制和业务层设计问题,asp.net-mvc,design-patterns,architecture,fluent-nhibernate,unit-of-work,Asp.net Mvc,Design Patterns,Architecture,Fluent Nhibernate,Unit Of Work,我正在设计一个ASP.NET MVC3应用程序,我希望在3层体系结构中明确区分关注点。我使用Fluent NHibernate作为ORM,这是一种存储库模式,用于处理NHibernate映射的实体。我想添加一个带有工作单元模式的适当业务层,保持MVC部分仅用于表示(通过使用通过业务层映射到nHibernate实体的ViewModels)。很好地描述了组合的3层和MVC体系结构 根据本文,我看不到业务层的明确区别。工作单元类为每种存储库类型提供强类型的getter,这看起来适合于业务层。然而,它公
-如果是,这是否意味着我们可以向其中添加自定义业务逻辑方法?
-如果不是,我们是否用包含业务逻辑方法的其他类包装工作单元 我欣赏任何想法或例子。谢谢。你调查过这个问题了吗?它具有内置的MVC事务处理,使用动作过滤器 我通常是一个分层的纯粹主义者,所以我对MVC的开放并不感兴趣,但我开始喜欢它了 有赞成和反对之分,但以下是其优点:
如果您不想使用S#arp,您仍然可以在ActionFilter中仅使用几行代码在View中实现开放会话。在操作执行方法上,打开会话。在action executed方法中,提交、关闭和处置。这就是我们在我的项目中所做的,它对我们很有效。任何基于web的应用程序都存在的问题是,由于需要通过HTTP会话管理对象生命周期,UI必须与业务层进行某种耦合。在一个典型的桌面应用程序中,您不必担心会话,因此可以很容易地将所有事务处理进一步向下移动 考虑在三个应用程序(一个网站、一个Web服务和一个桌面应用程序)中重用相同逻辑的位置。如果不将事务处理公开给表示层,就没有处理事务提交的好方法,因为业务层不知道对象将存在多长时间 因此,您的选择是,要么确保提交业务对象的每个方法中的所有内容,要么将事务公开给UI
第三种选择是构建一个相当复杂的会话管理控制器,我甚至都不想考虑这个问题。。。会话管理控制器可以耦合到ui和业务逻辑,在某种程度上将它们分开。。但是这需要更多的分析。首先,我想澄清一下关于业务层的一些错误概念,因为您想要使用存储库模式,并且您的设置是一个候选,那么业务层实际上就是[域模型](在实体和对象中以面向对象的方式设计业务逻辑)和应用程序层,以协调事务、操作和域层的命令),因此建议的体系结构如下:
- 演示文稿(MVC)[OrderView、OrderPresentationModel、OrderController]
- 应用程序[订单服务]
- 使用UnitOfWork(事务)和存储库来执行域逻辑
- DTO[订单DTO,客户DTO]
- 领域
- 实体和价值对象[订单、客户、行项目、地址]
- 存储库接口[IOrderRepository,ICustomerRepository]
- (可选)工作单元接口[i工作单元]
- Infrastructure.DataAccess(使用ORM或数据访问技术)
- 存储库[OrderRepository,CustomerRepository]
- (可选)工作单元[工作单元]
- 基础设施.普通
- 伐木
- 公用事业
_orderService.CreateOrder(OrderDTO);
[应用程序]订购服务:
_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类与业务层类相同吗?
-如果是这样,这是否意味着我们可以向其中添加自定义业务逻辑方法?
-如果不是,我们是否将工作单元包装为