DDD项目目录(包、模块)结构

DDD项目目录(包、模块)结构,第1张

在项目的开发阶段,目录结构的划分往往被看做是迈向成功的第一步。这一步的迈出往往伴随着很多方面的权衡(考量),总的来说是两个方面的考量:业务方面和技术方面。

常见的项目的目录结构基本上由:领域名(domain)、层名(layer)、构造型名(stereotype)、业务模块名(module)这四个部分组成。

在《领域驱动设计》中的领域通常是指一个业务域,是一个特定的业务范围。对于大多数的业务(问题)来说不会超出所在业务域的范围,因此业务域的名称在项目的目录(包、模块)结构中能起到限界作用。比如:产品目录子域(Catalog)、订单子域(Order)、物流子域(Shipping)、发票子域(Invoice)等等。

在项目的目录结构中显式的引入层名是一种技术考量,更具体一些是编码的考量。分层架构是一种从混乱到有序的解决方案(架构模式)。它的做法是将一个应用程序(流程)划分为多组子任务,其中每组子任务都位于特定抽象层中。例如:分层架构在应用系统的后端开发中,常将一个应用系统划分为三层架构或者四层架构。

三层架构:

表现层(Presentation)

业务逻辑层(Business)

持久层(Persistence)

四层架构:

表现层(Presentation)

应用(逻辑)层(Application)

领域层(Domain)

基础设施层(Infrastructure)

在四层架构中的基础设施层要比三层架构中的持久层的功能多一些。

在应用系统开发中的分层架构并不是严格意义上的分层架构。真正的分层表示为上层只能依赖下层,是单向依赖,不能存在双向依赖。具体来说有以下特点:

J 层依赖 J - 1 层,J + 1 层依赖 J 层。

J - 1 层不会依赖 J 层,J 层也不会依赖 J + 1 层。

J + 1 层也不会依赖 J - 1 层。

层与层之间通过数据的封装、转换或者直接使用来做到隔离。

在追求性能和灵活性方面,出现了两种分层变种:宽松的分层系统(Relaxed Layered System)和通过继承进行分层(Layering Through Inheritance)。我们将简要讨论 宽松的分层系统,因为普遍地应用系统采用的就是宽松的分层系统。

宽松的分层系统表示:每层都可以使用它的下层服务,而不仅仅是下一层的服务。每层都可能是半透明的,这意味着有些服务只对上一层可见,而有些服务对上面的所有层都可见。

就算是严格地分层架构或者宽松的分层架构,都表明是上层依赖下层。但在实际地应用系统的架构中并没有完全遵循这种依赖关系,因为架构人员需要在整体架构与分层架构之间进行摇摆球式思考。比如:在领域(Domain)层中的 Repository 接口的实现类往往会放在基础设施(Infrastructure)层中,这显然违反了分层架构中的单向依赖关系。这样的问题有两种解决方案:一是诚然接受。二是将领域层中的 Repository 接口的实现类放置在领域层内。

构造型使用书名号(《》)来表示,用于区分不同地建模元素。

如:实体(entity)、枚举(enumeration)、异常(exception)、查询(query)、事件(event)、资源库(repository)、服务(service)、控制器(controller)等等都是常见的构造型。

有些项目在划分目录结构时,会将构造型显式的引入到目录结构中,这是一种归类的组织方式。

如entity包,service包等。

在分析一个业务(问题)域时,会将一个业务域划分为多个业务模块。比如在商店(Store)子域中会被划分为:商店员工(Staff)、商店会员(Member)、商店角色(Role)等等。

看到这里,如果你还迷茫,那我再来举个例子:

商品领域 划分成 商品品牌模块、商品类目模块、商品模块等

所以,领域是业务界限,业务模块是按抽象出的概念。

在分别对目录(包)结构的构成元素做了简单介绍后,下面要开始具体探讨由这些元素组合而成的目录结构了。

业务域名层名

业务域名层名业务模块名

业务域名构造型名

业务域名构造型名业务模块名

业务域名(层名 & 构造型名)

业务域名(层名 & 构造型名)业务模块名

业务域名业务模块名

业务域名业务模块名层名

业务域名业务模块名构造型名

业务域名业务模块名(层名 & 构造型名)

业务域名(业务模块名 & 层名 & 构造型名)

(构造型名 || 层名)业务域名业务模块名

补充说明:

省略包(package)的反向域名(orgmallfoundry)前缀的部分。

领域看作是业务域,其中业务域名是业务域 名,而不是业务 域名。

(层名 & 构造型名)是一种混合,表示在同一级别的目录(包)结构上同时存在按层和按构造型划分的两种方式。

我的理解是:

参考: 解读DDD中的包结构

1vuex的优缺点

2vuex的使用

先上目录结构:

项目中想要管理的数据和状态都在这

连接actions和mutations的桥梁( *** 作数据的指令)

处理数据, *** 作状态,获取数据都在这,同步去处理数据对应的调用方法 commit

要改变数据时直接用this$storecommit(SET_LOGIN_MSG, loginMsg)即可

对于一些接口数据,可能需要在组件内异步得去处理一些事情,这时候就需要写在这里,对应的调用方法是dispatch,需要注意的是:它提交的是mutation,不做数据和状态的更改,这些 *** 作在mutations中处理

这里的参数 context 是对象{commit, state},后一个参数是你需要传的数据

对应的在组件内调用方法

由于是异步得所有可以用promise封装使用,解决callhack

以上方法就可以完成vuex的整个状态管理了,完全没有任何问题。但有时候会有一些需求,比如变量name需要在firstName和lastName其中任何一个发生变化时同时发生变化,如果在组件内我们使用computed就能做到,在vuex需要我们的getters登场

Module

到这就完了吗?并没有。如果是大型项目,你会发现需要使用vuex的数据太多了,然而把所有的数据处理全部放在 mutationsjs文件中显得很杂乱,并不利于查找与管理,此时我们就需要Module,分模块管理。怎么做呢?

mod1和mod2就是 被分成的两个子模块。因为每个子模块数据和状态不会太多,因此我们把state,mutations,actions,getter写在一个文件中如下

mod1js

mod2js也是如此

那么如何调用呢?

更新数据的方法会有所变化吗?依然按照原来的方法使用就行了

总结:

将store进行拆分,有利于我们更好的管理项目中的状态,以及使我们的项目维护更加加单高效。各个模块之间的开发互相不影响。

3vuex的注意点

a在以往我们更新数据时为了防止数据随时变化所以会在更新组件时及时更新数据,甚至每隔一段时间更新数据,有了vuex就无需这么做了,我们只要在我们更改数据时更新一下数据即可。如用户的基本信息,我们只在用户对用户信息进行修改或增加时更新即可,这样在任何组件中使用用户信息时数据都是最新的。

b使用vuex我们在组件内更改数据是无效的。例如:this$storestatename=‘小明‘,这么做会报错。

获取当前程序文件的路径也算是一个比较常见的需求 比如我有一个文件conn xml位于 exe的同一目录 在运行时需要从中读取一些设置信息

string str =Process GetCurrentProcess() MainModule FileName;//可获得当前执行的exe的文件名

string str =Environment CurrentDirectory;//获取和设置当前目录(即该进程从中启动的目录)的完全限定路径

//备注 按照定义 如果该进程在本地或网络驱动器的根目录中启动 则此属性的值为驱动器名称后跟一个尾部反斜杠(如 C:\ ) 如果该进程在子目录中启  动 则此属性的值为不带尾部反斜杠的驱动器和子目录路径(如 C:\mySubDirectory )

string str =Directory GetCurrentDirectory();//获取应用程序的当前工作目录

string str =AppDomain CurrentDomain BaseDirectory;//获取基目录 它由程序集冲突解决程序用来探测程序集

string str =Application StartupPath;//获取启动了应用程序的可执行文件的路径 不包括可执行文件的名称

string str =Application ExecutablePath;//获取启动了应用程序的可执行文件的路径 包括可执行文件的名称

string str =AppDomain CurrentDomain SetupInformation ApplicationBase;//获取或设置包含该应用程序的目录的名称

System Diagnostics Process GetCurrentProcess() MainModule FileName

获取模块的完整路径

System Environment CurrentDirectory

获取和设置当前目录(该进程从中启动的目录)的完全限定目录

System IO Directory GetCurrentDirectory()

获取应用程序的当前工作目录 这个不一定是程序从中启动的目录啊 有可能程序放在C:\里 这个函数有可能返回C:\Documents and Settings\ZYB\ 或者C:\Program Files\Adobe\ 有时不一定返回什么东东 我也搞不懂了

System AppDomain CurrentDomain BaseDirectory

获取程序的基目录

System AppDomain CurrentDomain SetupInformation ApplicationBase

获取和设置包括该应用程序的目录的名称

System Windows Forms Application StartupPath

获取启动了应用程序的可执行文件的路径 效果和 一样 只是 返回的字符串后面多了一个 \ 而已

System Windows Forms Application ExecutablePath

获取启动了应用程序的可执行文件的路径及文件名 效果和 一样

对于Windows程序 和Web 应用程序来说 他们运行的路径是不一样的 所以关键是判断当前运行的程序是哪种程序 于是我们可以使用如下的代码  string path = ;

if (System Environment CurrentDirectory == appDomain CurrentDomain BaseDirectory)//Windows应用程序则相等

{

path = AppDomain CurrentDomain BaseDirectory;

}

else

{

path = AppDomain CurrentDomain BaseDirectory + Bin\ ;

}

这样如果我们写了一个类库 类库中用到了Assembly LoadFrom 由于是通用类库 所以可能用到Windows程序中也可能用到Web中 那么用上面的代码就很方便了

Server MapPath

System Windows Forms StartupPath

Type Assembly Location

方法 可以应用于控制台应用程序 WinForm应用程序 Windows服务 方法 可以应用于Web应用程序 方法 都可以应用

但方法 是加载应用程序的路径 如果是Web应用程序 取得的路径是C:\WINDOWS\Microsoft NET\Framework\v \Temporary ASP NET Files目录 所以Web项目还是使用Server MapPath吧 否则建议使用方法 如果自己新建类库 可以加入对System Windows Forms StartupPath的引用后使用

进程对象在 NET中表现为System Diagnostics Process类 通过调用Process GetCurrentProcess() MainModule FileName可获得当前执行的exe的文件名 但是这个方法得到的仅仅是文件名 如果程序运行期间没有切换工作目录 那么可以调用System IO Path的方法获取绝对路径 但是当前目录同样可以通过Environment CurrentDirectory获得 而且很多软件在使用Open Dialog打开文件的时候 都会切换工作目录 而使得这一机制失效

如果是在Windows Forms应用程序中 当前应用也表现为System Windows Forms Application对象 通过其静态属性Application ExecutablePath和Application StartupPath 可以取得可执行文件的路径和启动路径

但如果不是在Windows应用中呢 或者是在Library中呢 就算是Application对象的属性依然能获得 也需要在工程中添加System Windows Forms这个Assembly的引用 非常不方便 这个时候 可以通过Assembly的静态方法 GetCallingAssembly或者GetExecutingAssembly取得当前执行的Assembly 然后通过Assembly类的Location获取assembly的位置

但是使用Assembly的时候 可能会遇到权限方面的问题 同时Assembly GetCallingAssembly或者Assembly GetExecutingAssembly有可能得到的不是 exe文件的位置 在GAC中的添加了强名的Assembly 运行时是可以不必与 exe在同一目录的

NET的进程启动时 会创建AppDomain 所有的Assembly都被Load到某一个AppDomain中 而AppDomain中提供了SetupInformation属性 可以获取AppDomain启动时的一些信息 因此 可以通过调用AppDomain CurrentDomain SetupInformation ApplicationBase获取当前应用程序所在的路径

在通过以上方法取到所需的目录后 可以调用System IO Path的方法获取文件名 目录名 绝对路径等 停止对路径字符串的分析 而改用System IO Path类吧

lishixinzhi/Article/program/net/201311/11363

给你几个获取应用程序目录的方法:

SystemEnvironmentCurrentDirectory

获取和设置当前目录(该进程从中启动的目录)的完全限定目录。

SystemIODirectoryGetCurrentDirectory()

获取应用程序的当前工作目录。

SystemAppDomainCurrentDomainBaseDirectory

获取程序的基目录。

SystemAppDomainCurrentDomainSetupInformationApplicationBase

获取和设置包括该应用程序的目录的名称。

SystemWindowsFormsApplicationStartupPath

获取启动了应用程序的可执行文件的路径

为促进健康体检管理有序进行,保护和增进人民群众健康,制定了相关暂行规定,下面我给大家分享关于健康体检管理暂行规定的相关资料,希望对您有帮助。

健康体检管理暂行规定如下

第一章 总则

第一条 为加强健康体检管理,保障健康体检规范有序进行,根据《中华人民共和国执业医师法》、《医疗机构管理条例》、《护士条例》等法律法规制定本规定。

第二条 本规定所称健康体检是指通过医学手段和方法对受检者进行身体检查,了解受检者健康状况、早期发现疾病线索和健康隐患的诊疗行为。

第三条 卫生部负责全国健康体检的监督管理。县级以上地方人民政府卫生行政部门负责本行政区域内健康体检的监督管理。

第二章 执业条件和许可

第四条 具备下列条件的医疗机构,可以申请开展健康体检。

(一)具有相对独立的健康体检场所及候检场所,建筑总面积不少于400平方米,每个独立的检查室使用面积不少于6平方米;

(二)登记的诊疗科目至少包括内科、外科、妇产科、眼科、耳鼻咽喉科、口腔科、医学影像科和医学检验科;

(三)至少具有2名具有内科或外科副高以上专业技术职务任职资格的执业医师,每个临床检查科室至少具有1名中级以上专业技术职务任职资格的执业医师;

(四)至少具有10名注册护士;

(五)具有满足健康体检需要的其他卫生技术人员;

(六)具有符合开展健康体检要求的仪器设备。

第五条 医疗机构向核发其《医疗机构执业许可证》的卫生行政部门(以下简称登记机关)申请开展健康体检。

第六条 登记机关应当按照第四条规定的条件对申请开展健康体检的医疗机构进行审核和评估,具备条件的允许其开展健康体检,并在《医疗机构执业许可证》副本备注栏中予以登记。

第三章 执业规则

第七条 医疗机构根据卫生部制定的《健康体检基本项目目录》制定本单位的《健康体检项目目录》(以下简称《目录》),并按照《目录》开展健康体检。

医疗机构的《目录》应当向登记机关备案;不设床位和床位在99张以下的医疗机构还应向登记机关的上一级卫生行政部门备案。

第八条 医疗机构应用医疗技术进行健康体检,应当遵守医疗技术临床应用管理有关规定,应用的医疗技术应当与其医疗服务能力相适应。

医疗机构不得使用尚无明确临床诊疗指南和技术 *** 作规程的医疗技术用于健康体检。

第九条 医疗机构开展健康体检应当严格遵守有关规定和规范,采取有效措施保证健康体检的质量。

第十条 医疗机构应当采取有效措施保证受检者在健康体检中的医疗安全。

第十一条 医疗机构开展健康体检应当按照有关规定履行对受检者相应的告知义务。

第十二条 医疗机构应当按照《医疗机构临床实验室管理办法》有关规定开展临床实验室检测,严格执行有关 *** 作规程出具检验报告。

第十三条 各健康体检项目结果应当由负责检查的相应专业执业医师记录并签名。

第十四条 医疗机构应当对完成健康体检的受检者出具健康体检报告。健康体检报告应当包括受检者一般信息、体格检查记录、实验室和医学影像检查报告、阳性体征和异常情况的记录、健康状况描述和有关建议等。

第十五条 健康体检报告应当符合病历书写基本规范。

第十六条 医疗机构应当指定医师审核签署健康体检报告。负责签署健康体检报告的医师应当具有内科或外科副主任医师以上专业技术职务任职资格,经设区的市级以上人民政府卫生行政部门培训并考核合格。

第十七条 医疗机构开展健康体检必须接受设区的市级以上人民政府卫生行政部门组织的质量控制管理。

第十八条 医疗机构应当制定合理的健康体检流程,严格执行有关规定规范,做好医院感染防控和生物安全管理。

第十九条 医疗机构开展健康体检不得以赢利为目的对受检者进行重复检查,不得诱导需求。

第二十条 医疗机构不得以健康体检为名出售药品、保健品、医疗保健器械等。

第二十一条 医疗机构应当加强健康体检中的信息管理,确保信息的真实、准确和完整。未经受检者同意,不得擅自散布、泄露受检者的个人信息。

第二十二条 受检者健康体检信息管理参照门诊病历管理有关规定执行。

第四章 外出健康体检

第二十三条 外出健康体检是指医疗机构在执业地址以外开展的健康体检。

除本规定的外出健康体检,医疗机构不得在执业地址外开展健康体检。

第二十四条 医疗机构可以在登记机关管辖区域范围内开展外出健康体检。

第二十五条 医疗机构开展外出健康体检前,应当与邀请单位签订健康体检协议书,确定体检时间、地点、受检人数、体检的项目和流程、派出医务人员和设备的基本情况等,并明确协议双方法律责任。

第二十六条 医疗机构应当于外出健康体检前至少20个工作日向登记机关进行备案,并提交以下备案材料:

(一)外出健康体检情况说明,包括邀请单位的基本情况、受检者数量、地址和基本情况、体检现场基本情况等;

(二)双方签订的健康体检协议书;

(三)体检现场标本采集、运送等符合有关条件和要求的书面说明;

(四)现场清洁、消毒和检后医疗废物处理方案;

(五)医疗机构执业许可证副本复印件。

第二十七条 外出健康体检的场地应当符合本办法第四条第一项要求。进行血液和体液标本采集的房间应当达到《医院消毒卫生标准》中规定的Ⅲ类环境,光线充足,保证安静。

第二十八条 医疗机构应当按照《目录》开展外出健康体检。外出健康体检进行医学影像学检查和实验室检测必须保证检查质量并满足放射防护和生物安全的管理要求。

第五章 监督管理

第二十九条 无《医疗机构执业许可证》开展健康体检的,按照《医疗机构管理条例》第四十四条处理。

医疗机构未经许可开展健康体检的,按照《医疗机构管理条例》第四十七条处理。

第三十条 未经备案开展外出健康体检的,视为未变更注册开展诊疗活动,按照《医疗机构管理条例》和《执业医师法》有关条款处理。

第三十一条 健康体检超出备案的《健康体检项目目录》的,按照《医疗机构管理条例》第四十七条处理。

第三十二条 医疗机构出具虚假或者伪造健康体检结果的,按照《医疗机构管理条例》第四十九条处理。

第三十三条 开展健康体检引发医疗事故争议的按照《医疗事故处理条例》处理。

第六章 附则

第三十四条 本规定所称健康体检不包括职业健康检查、从业人员健康体检、入学、入伍、结婚登记等国家规定的专项体检、基本公共卫生服务项目提供的健康体检和使用新型农村合作医疗基金为参加新型农村合作医疗农民开展的健康体检以及专项疾病的筛查和普查等。

第三十五条 已开展健康体检服务的医疗机构,应当在2009年11月30日前完成健康体检服务登记。

第三十六条 本办法自2009年9月1日起施行。

不明白你说的“显示”是什么意思。

在第一个项目中是可以调用类库中的两个类的。

首先你的类库中的两个类必须用public修饰。然后右键你的项目名-添加引用-项目,把拟建的类库添加加到你原来的项目中去。再在你原来项目的类中编写代码,引入命名空间,

using System;

using SystemCollectionsGeneric;

using SystemLinq;

using SystemText;

using TestSolution;//这个就是新建的类库名称

接下来就很简单了啊

class Test//这个类就是原先项目中的类,注意,他不是建好的类库中的代码

{

a a = new a();//这里不是可以调用么?

b b = new b();//这里不是可以调用么?

}

其实也不是非常明白你的意思,我只是按我的理解去做的,如果不对别见怪,如果对了,希望可以帮到你

以上就是关于DDD项目目录(包、模块)结构全部的内容,包括:DDD项目目录(包、模块)结构、浅谈vue项目进阶开发-vuex篇、asp.net获取控制台应用程序路径等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/9574430.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存