Leo*_*eon 1 architecture business-logic view n-tier-architecture
这是一个高级项目组织问题.
组织包含许多子应用程序的项目/解决方案(Visual Studio)的"正确"方法是什么?
这必须是大型企业级项目中的常见问题.任何人都可以指向白皮书/书籍/链接,以帮助决定如何构建这个?
在24小时内学习企业架构将是完美的,但似乎并不存在.
我们的第一次尝试遵循3层服务架构,但除了通用业务功能(ProcessOrder(..),BalanceAccount(..)等),我们还需要特定于应用程序的数据.
遵循n层架构,所有应用程序仍然需要通过BLL - > DLL来获取任何信息(ViewModel,特定于应用程序的数据).
一些模型类(BOM)是通用的,可以在整个过程中使用(订单,账单,账户,客户等)
一种选择是将所有业务实体集中在同一个Enterprise.BOM项目下,并具有多个名称空间 - 一些是全局的,一些是ViewModel类的特定应用程序.
然后BLL和DAL层将遵循相同的组织 - 每个应用程序都有自己的命名空间,并且在任何地方使用的东西都放在根命名空间中.
但随着应用程序数量的增长,重用现有对象/进程将是一项挑战(即每个应用程序可能需要对Bill信息执行某些操作,但不应定义自己的Bill类,而应使用BLL/DAL中的现有类).
从顶部强制要求的另一个方向是以SOA-izable方式开发所有内容:"应用程序"有效地成为BLL中定义的所有流程业务逻辑的视图/工作流,因此"应用程序"(基本上是UI)可以替换为服务层向外部系统公开功能.
如果相关,我们是一个带有规则引擎的.NET商店,但是没有工作流程(虽然它可能在一两年内,因此未来的WS集成很重要).
提前致谢!
在24小时内学习企业架构将是完美的
我不相信它,即使它确实存在:)请记住,没有一种真正的方法来构建一个企业.在任何情况下,没有一种模式比其他模式更好.您的企业将找到自己的方式.会有折衷,会有妥协等等.有些事情对开发人员有意义,有些事情对用户有意义,有些事情对管理有意义......但一切都应该对业务有意义.
话虽这么说,在这里采取任何建议与一粒盐.
在组织代码时,一个好的经验法则是问自己"哪个代码是这个?" 也就是说,对于你正在编写的任何内容,整个系统的哪个部分关心它?这就是代码所属的地方.如果它是指定某些UI行为的代码,则它不属于DAL.如果它是维护核心业务逻辑的代码,则它不属于UI.等等.
一种对我有用的方法是域驱动设计.作为一个过程,我倾向于这样做:
Order
是什么.他们都知道当你打电话时会发生什么Order.Submit()
.这是你的BLL,它所关心的只是业务逻辑.应该没有UI问题,没有数据持久性问题,没有任何类似问题.这是定义业务逻辑的核心程序集,可以在域中的任何应用程序中重用.现在,一些应用程序将需要使用更多自定义对象.也许一个应用程序想要使用Order
该类,但以某种方式重新塑造它.甚至可能将它与其他课程结合起来.这可以.这是该应用程序的一个问题.在内部,它将拥有自己的迷你域,在其中定义其自定义模型,并具有自己的自定义DAL,以将这些模型转换为核心域模型.这将更像是一个"ViewModel",因为它完全属于该应用程序,而不属于业务逻辑.
将每个应用程序视为一个微型域.从整个域的角度来看,每个应用程序都是UI的一部分.从应用程序本身的角度来看,整个域是应用程序持久性背后的基础架构.
因此,通常您可能会看到我的Visual Studio项目组织如下:
Project: MyBusiness.Domain
Folder: Models
Folder: Services
Folder: Repositories
Project: MyBusiness.Infrastructure.DAL
Reference: MyBusiness.Domain
Folder: Repositories
Project: MyBusiness.Infrastructure.AddressService
Reference: MyBusiness.Domain
Folder: Services
Project: MyBusiness.Application.Intranet
Reference: MyBusiness.Domain
Folder: Controllers
Folder: Views
Folder: ViewModels
Project: MyBusiness.Application.CustomerIntegrationService
Reference: MyBusiness.Domain
Folder: ServiceDTOs
Run Code Online (Sandbox Code Playgroud)
等等.我使用IoC容器(StructureMap是我个人最喜欢的,但还有很多其他容器)来连接依赖项.除了Models之外,Domain项目中的几乎所有内容都只是一个接口.可以有多个基础结构项目实现这些接口,每个应用程序项目可以配置在连接IoC容器时要使用哪些接口.
这种方法使关注点非常清晰.您可以根据需要使用域核心拥有尽可能多的应用程序,并且可以根据需要拥有尽可能多的依赖项实现(包括测试模拟实现).
我希望这有所帮助,并且最终不会在一些切线上结束.我承认,要准确描述你在问题中提出的问题有点困难.
归档时间: |
|
查看次数: |
541 次 |
最近记录: |