业务层Facade与混合业务组件 我目前正在设计一个大型应用程序的基础。我们将使用传统的三层系统,在数据层使用EF,在业务层使用普通的jane c#类,在ui层使用MVC/WCF。我们已经对应用程序进行了足够的原型化,从而认识到这对我们来说是可行的,但是由于业务需求的复杂性,一些业务组件相互交互是常见的。

业务层Facade与混合业务组件 我目前正在设计一个大型应用程序的基础。我们将使用传统的三层系统,在数据层使用EF,在业务层使用普通的jane c#类,在ui层使用MVC/WCF。我们已经对应用程序进行了足够的原型化,从而认识到这对我们来说是可行的,但是由于业务需求的复杂性,一些业务组件相互交互是常见的。,c#,.net,asp.net-mvc,architecture,n-tier-architecture,C#,.net,Asp.net Mvc,Architecture,N Tier Architecture,考虑以下两个业务组件: RetailManager-处理系统中与零售相关的所有事项 CartManager-处理与购物车体验相关的所有事项 例如,在购买商品的结帐过程中,这两者相互作用。需要减少采购项目的库存 以下是我迄今为止的思考过程: 让业务组件相互引用,并确保循环引用不会发生(CartManager引用RetailManager,但决不会以相反的方式)。“Checkout”将是CartManager类上的一个方法,它将调用RetailManager上的一个方法来调整库存。虽然这会起作用

考虑以下两个业务组件:

  • RetailManager-处理系统中与零售相关的所有事项
  • CartManager-处理与购物车体验相关的所有事项
例如,在购买商品的结帐过程中,这两者相互作用。需要减少采购项目的库存

以下是我迄今为止的思考过程:

  • 让业务组件相互引用,并确保循环引用不会发生(CartManager引用RetailManager,但决不会以相反的方式)。“Checkout”将是CartManager类上的一个方法,它将调用RetailManager上的一个方法来调整库存。虽然这会起作用,但我不确定它的可扩展性如何,以及随着时间的推移,维护成本将是多少。我觉得这不是100%的“正确”

  • 在业务组件和UI层之间创建外观。在本例中,Facade将具有checkout方法和对两个管理器的引用。与第一种方法相比,我更喜欢这种方法,但是我知道并不是所有业务对象都需要Facade,我不想创建大量Facade类,只是为了拥有空的传递方法

  • 我倾向于使用2,但需要注意的是,我将只在需要的地方创建facade类。UI层将可以访问Facade和business层组件,并且必须知道何时使用哪个组件(我不喜欢这个解决方案的唯一部分)

    我做了很多研究,但还没有找到一个完全正确的解决方案

    任何关于以这种方式使用facade模式的想法,或者其他解决问题的想法都是受欢迎的


    提前感谢。

    我倾向于使用facade实现

    我首先要问自己,在结账时,谁有责任确保减少库存?我认为减少库存不是CartManager的责任。我会有第三个类(在你的例子中是facade),它确保每当一个项目被
    CartManager
    签出时,相应的项目都会从库存中减少


    我将考虑的另一个选项是基于事件的实现。code>CartManager将在项目签出时引发

    ItemCheckedOut
    事件
    RetailManager
    将订阅此事件,并在引发事件时减少库存。如果您是事件驱动设计的新手,请关注quora上的这个问题-

    我倾向于使用facade实现

    我首先要问自己,在结账时,谁有责任确保减少库存?我认为减少库存不是CartManager的责任。我会有第三个类(在你的例子中是facade),它确保每当一个项目被
    CartManager
    签出时,相应的项目都会从库存中减少


    我将考虑的另一个选项是基于事件的实现。code>CartManager将在项目签出时引发

    ItemCheckedOut
    事件
    RetailManager
    将订阅此事件,并在引发事件时减少库存。如果您是事件驱动设计的新手,请遵循quora上的这个问题-

    我个人喜欢的模式,它自然适合其他架构模式
    例如,并适合于复杂领域。

    我个人喜欢的模式,它自然适合其他架构模式
    这是使用管理器/服务类的典型问题。他们总是容易发胖。当您达到这一点时,最好开始使用命令

    因为您使用的是IoC,所以最棒的事情是您不必直接重构所有代码,但可以在有时间的时候进行重构。只需开始为所有新功能编写命令,同时为所有其他功能保留旧体系结构

    以下是命令简介:


    以及我自己的框架简介:

    这是使用管理器/服务类的典型问题。他们总是容易发胖。当您达到这一点时,最好开始使用命令

    因为您使用的是IoC,所以最棒的事情是您不必直接重构所有代码,但可以在有时间的时候进行重构。只需开始为所有新功能编写命令,同时为所有其他功能保留旧体系结构

    以下是命令简介:


    以及我自己的框架介绍:

    您考虑过DDD方法吗?是的,也不是。谢谢你的推荐。我会好好看一看的。可以说,我们的业务对象是我们考虑域的聚合根。话虽如此,我需要重温一下DDD原则。看看这篇文章,你考虑过DDD方法吗?是的,也不是。谢谢你的推荐。我会好好看一看的。可以说,我们的业务对象是我们考虑域的聚合根。话虽如此,我还是需要重温一下DDD原则。看看这篇文章,我同意这不是CartManager的责任。我倾向于你在第一段中描述的内容。我对事件驱动设计有很高的理解,但对使用它几乎没有实际知识。我会查看你的链接,