问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

框架结构的构件体系主要有哪几个子系统构成?

发布网友 发布时间:2022-04-24 08:09

我来回答

2个回答

懂视网 时间:2022-05-19 15:36

DDD分层
为了减少复杂性和提高代码的可重用性,采用分层架构是一种被广泛接受的技术。
为了实现分层的体系结构,ABP遵循DDD(领域驱动设计)的原则,将分为四个层次:

  • 展现层(Presentation):提供一个用户界面,实现用户交互操作。
  • 应用层(Application):进行展现层与领域层之间的协调,协调业务对象来执行特定的应用程序的任务。它不包含业务逻辑。
  • 领域层(Domain):包括业务对象和业务规则,这是应用程序的核心层。
  • 基础设施层(Infrastructure):提供通用技术来支持更高的层。例如基础设施层的仓储(Repository)可通过ORM来实现数据库交互。
  • 根据实际需要,可能会有额外添加的层。例如:

    分布式服务层(Distributed Service):用于公开应用程序接口供远程客户端调用。比如通过ASP.NET Web API和WCF来实现。
    这些都是常见的以领域为中心的分层体系结构。不同的项目在实现上可能会有细微的差别。


    ABP的体系结构

    2016615164420752.png (858×426)

    一个简单的解决方案,大致包含5个项目:

    2016615164448542.png (291×128)

    每一层可以用一个或多个程序集来实现。
    1.领域层(Domain)
            领域层就是业务层,是一个项目的核心,所有业务规则都应该在领域层实现。
    2.实体(Entity)
      实体代表业务领域的数据和操作,在实践中,通过用来映射成数据库表。
    3.仓储(Repository)
      仓储用来操作数据库进行数据存取。仓储接口在领域层定义,而仓储的实现类应该写在基础设施层。
    4.领域服务(Domain service)
      当处理的业务规则跨越两个(及以上)实体时,应该写在领域服务方法里面。
    5.领域事件(Domain Event)
      在领域层某些特定情况发生时可以触发领域事件,并且在相应地方捕获并处理它们。
    6.工作单元(Unit of Work)
      工作单元是一种设计模式,用于维护一个由已经被修改(如增加、删除和更新等)的业务对象组成的列表。它负责协调这些业务对象的持久化工作及并发问题。


    应用层(Application)
    应用层提供一些应用服务(Application Services)方法供展现层调用。一个应用服务方法接收一个DTO(数据传输对象)作为输入参数,使用这个输入参数执行特定的领域层操作,并根据需要可返回另一个DTO。在展现层到领域层之间,不应该接收或返回实体(Entity)对象,应该进行DTO映射。一个应用服务方法通常被认为是一个工作单元(Unit of Work)。用户输入参数的验证工作也应该在应用层实现。ABP提供了一个基础架构让我们很容易地实现输入参数有效性验证。建议使用一种像AutoMapper这样的工具来进行实体与DTO之间的映射。
     
    基础设施层(Infrastructure)
    当在领域层中为定义了仓储接口,应该在基础设施层中实现这些接口。可以使用ORM工具,例如EntityFramework或NHibernate。ABP的基类已经提供了对这两种ORM工具的支持。数据库迁移也被用于这一层。
     
    WEB与展现层(Web & Presentation)
    Web层使用ASP.NET MVC和Web API来实现。可分别用于多页面应用程序(MPA)和单页面应用程序(SPA)。
    在SPA中,所有资源被一次加载到客户端浏览器中(或者先只加载核心资源,其他资源懒加载),然后通过AJAX调用服务端WebApi接口获取数据,再根据数据生成HTML代码。不会整个页面刷新。现在已经有很多SPA的JS框架,例如: AngularJs、 DurandalJs、BackboneJs、EmberJs。 ABP可以使用任何类似的前端框架,但是ABP提供了一些帮助类,让我们更方便地使用AngularJs和DurandalJs。
    在经典的多页面应用(MPA)中,客户端向服务器端发出请求,服务器端代码(ASP.NET MVC控制器)从数据库获得数据,并且使用Razor视图生成HTML。这些被生成后的HTML页面被发送回客户端显示。每显示一个新的页面都会整页刷新。
    SPA和MPA涉及到完全不同的体系结构,也有不同的应用场景。一个管理后台适合用SPA,博客就更适合用MPA,因为它更利于被搜索引擎抓取。
    SignalR是一种从服务器到客户端发送推送通知的完美工具。它能给用户提供丰富的实时的体验。
    已经有很多客户端的Javascript框架或库,JQuery是其中最流行的,并且它有成千上万免费的插件。使用Bootstrap可以让我们更轻松地完成写Html和CSS的工作。
    ABP也实现了根据Web API接口自动创建 Javascript的代码函数,来简化JS对Web Api的调用。还有把服务器端的菜单、语言、设置等生成到JS端。(但是在我自己的项目中,我是把这些自动生成功能关闭的,因为必要性不是很大,而这些又会比较影响性能)。
    ABP会自动处理服务器端返回的异常,并以友好的界面提示用户。


    ABP模块系统
    ABP框架提供了创建和组装模块的基础,一个模块能够依赖于另一个模块。在通常情况下,一个程序集就可以看成是一个模块。在ABP框架中,一个模块通过一个类来定义,而这个类要继承自AbpModule。
    译者注:如果学习过Orchard的朋友,应该知道module模块的强大了。模块的本质就是可重用性,你可以在任意的地方去调用,而且通过实现模块,你写的模块也可以给别人用。
    Assembly程序集:Assembly是一个包含来程序的名称,版本号,自我描述,文件关联关系和文件位置等信息的一个集合。最简单的理解就是:一个你自己写的类库生成的dll就可以看做是一个程序集,这个程序集可以包括很多类,类又包括很多方法等。
    .net可以通过反射获取一个程序集中的类以及方法。
    下面的例子,我们开发一个可以在多个不同应用中被调用MybolgApplication模块,代码如下:

    public class MyBlogApplicationModule : AbpModule //定义
    {
     public override void Initialize() //初始化
     {
     IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());
     //这行代码的写法基本上是不变的。它的作用是把当前程序集的特定类或接口注册到依赖注入容器中。
     }
    }
    

    ABP框架会扫描所有的程序集,并且发现AbpModule类中所有已经导入的所有类,如果你已经创建了包含多个程序集的应用,对于ABP,我们的建议是为每一个程序集创建一个Module(模块)。
    生命期事件
    在一个应用中,abp框架调用了Module模块的一些指定的方法来进行启动和关闭模块的操作。我们可以重载这些方法来完成我们自己的任务。
    ABP框架通过依赖关系的顺序来调用这些方法,假如:模块A依赖于模块B,那么模块B要在模块A之前初始化,模块启动的方法顺序如下:

  • PreInitialize-B
  • PreInitialize-A
  • Initialize-B
  • Initialize-A
  • PostInitialize-B
  • PostInitialize-A
  • 下面是具体方法的说明:

    1.PreInitialize
    预初始化:当应用启动后,第一次会调用这个方法。在依赖注入注册之前,你可以在这个方法中指定自己的特别代码。举个例子吧:假如你创建了一个传统的登记类,那么你要先注册这个类(使用IocManager对登记类进行注册),你可以注册事件到IOC容器。等。
    2.Initialize
    初始化:在这个方法中一般是来进行依赖注入的注册,一般我们通过IocManager.RegisterAssemblyByConvention这个方法来实现。如果你想实现自定义的依赖注入,那么请参考依赖注入的相关文档。
    3.PostInitialize
    提交初始化:最后一个方法,这个方法用来解析依赖关系。
    4.Shutdown
    关闭:当应用关闭以后,这个方法被调用。
     
    模块依赖(Module dependencies)
    Abp框架会自动解析模块之间的依赖关系,但是我们还是建议你通过重载GetDependencies方法来明确的声明依赖关系。

    [DependsOn(typeof(MyBlogCoreModule))]//通过注解来定义依赖关系
    public class MyBlogApplicationModule : AbpModule
    {
     public override void Initialize()
     {
     IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());
     }
    }
    

    例如上面的代码,我们就声明了MyBlogApplicationModule和MyBlogCoreModule的依赖关系(通过属性attribute),MyBlogApplicationModule这个应用模块依赖于MyBlogCoreModule核心模块,并且,MyBlogCoreModule核心模块会在MyBlogApplicationModule模块之前进行初始化。
     
    如何自定义的模块方法
    我们自己定义的模块中可能有方法被其他依赖于当前模块的模块调用,下面的例子,假设模块2依赖于模块1,并且想在预初始化的时候调用模块1的方法。

    public class MyModule1 : AbpModule
    {
     public override void Initialize() //初始化模块
     {
     IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());//这里,进行依赖注入的注册。
     }
     public void MyModuleMethod1()
     {
     //这里写自定义的方法。
     }
    }
    [DependsOn(typeof(MyModule1))]
    public class MyModule2 : AbpModule
    {
     private readonly MyModule1 _myModule1;
     public MyModule2(MyModule1 myModule1)
     {
     _myModule1 = myModule1;
     }
     public override void PreInitialize()
     {
     _myModule1.MyModuleMethod1(); //调用MyModuleMethod1的方法。
     }
     public override void Initialize()
     {
     IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());
     }
    }
    

    就这样,就把模块1注入到了模块2,因此,模块2就能调用模块1的方法了。

    热心网友 时间:2022-05-19 12:44

    框架结构的体系是由地基、框架柱、框架梁及楼板四种承重构件组成。
    由主梁,柱和基础构成平面框架,各平面框架再由连系梁连系起来,形成一个空间结构体系。
    注:由梁、柱承重。墙体不起承重作用,起分割空间作用。
    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    运航不锈钢304方管有哪几种型号 镀锌方管有哪些型号 方管型号有哪些 方管的型号有哪些 牌照过户要换新的吗 ...自己一辆江苏牌照的小汽车,名下还能拥有一辆杭州牌照的车吗?_百度... 方管有哪些厚度 国标方管的厚度有哪些规格? 学龄前,应该教会孩子哪些技能才合适? 对学龄前孩童来说什么最重要? 高分悬赏!如何在EXCEL里分组排序! 如何用表格自动数据分组 wps分组表格怎么做 怎样用EXCEL给数据分组? excel表格数据分组,excel表格怎么分组 请问怎么把表格中的数据平均分组? 两个苹果手机用同一个ID,照片没一点隐私,直接同步到另一部上了,求怎么解除~ 两个苹果手机共用一个id,如果我关闭了我的照片流,那么另一部手机里 分期乐上面的手表是真是假 请问在分期乐上,分期买的东西靠谱吗? 有没有用过分期乐的,在上面买手机可靠吗?? 在分期乐上分期买东西靠谱么 分期乐上的东西是真的吗? 新房装修完后适宜放的绿色植物有哪些? 新房装修完后适宜放的绿色植物有哪些 新房放什么植物好? 新房放什么植物好 新房装修适合养哪些绿植? 新房养什么绿植好养呢 新房放什么植物最吉利 请问如何将EXCEL表格里的内容快速分组 建筑按承重结构有哪些 WPS中的excel表格将字段分组在哪 建筑结构体系有那些 建筑按承重结构分类可分为哪几种? - 信息提示 手机照相怎么调节? p40照相是黑色怎么调回来? 如图所示是落锤打桩示意图.设锤和桩的质量分别为m 1 ,m 2 ,锤的下落高度为h,锤与桩作用时间极短且不 三星手机拍照出来后照片是反的,原本不是这样的,怎样才可以调回去? 三一225h挖掘机配多大破碎锤 魅族手机照相是倒的,怎么把它调整回来? 日立挖掘机ZX250H-3能配液压锤吗?销售人说配上车用不住!是吗??? 手机照相是反的怎么调? 三一245h能带多大的锤 三星手机拍照片倒过来了怎么调回来 h3000金锤s能刷小米miui系统么? 三一225H配多大破碎锤 2019年3月5日买了yeechuiH18一锤手机,第一天用就黑屏卡的不要,不要的又找不到售后及商 杜拉拉升职记电视剧在线观看 完整版