Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc ASP.NET MVC3-三层设计-事务控制和业务层设计问题_Asp.net Mvc_Design Patterns_Architecture_Fluent Nhibernate_Unit Of Work - Fatal编程技术网

Asp.net mvc ASP.NET MVC3-三层设计-事务控制和业务层设计问题

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,这看起来适合于业务层。然而,它公

我正在设计一个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类与业务层类相同吗?
-如果是,这是否意味着我们可以向其中添加自定义业务逻辑方法?
-如果不是,我们是否用包含业务逻辑方法的其他类包装工作单元

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

你调查过这个问题了吗?它具有内置的MVC事务处理,使用动作过滤器

我通常是一个分层的纯粹主义者,所以我对MVC的开放并不感兴趣,但我开始喜欢它了

有赞成和反对之分,但以下是其优点:

  • 延迟加载——如果您可以依赖MVC视图中的延迟加载,它将简化数据访问。无需显式连接到视图所需的所有表。(当延迟加载会产生大量查询时,请确保通过显式连接来避免错误。数据网格是常见的罪魁祸首。)
  • 更简单的BSO层——您的BSO不需要担心会话。假设您已经在会话的上下文中工作

  • 如果您不想使用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]
      • (可选)工作单元[工作单元]
    • 基础设施.普通
      • 伐木
      • 公用事业
    示例场景:

    [演示文稿]OrderController:

     _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类与业务层类相同吗? -如果是这样,这是否意味着我们可以向其中添加自定义业务逻辑方法? -如果不是,我们是否将工作单元包装为