游戏技术文章

基于AspNetCore的领域驱动快速开发模板项目

时间:2017-3-22 11:48:06  作者:棋牌资源网  来源:棋牌资源网  查看:6766  评论:0
内容摘要:AspNetCore发布以来就持续关注,利用业余时间写了一个项目快速开发的项目模板,已托管到github,如果想直接看源码请戳下面https://github.com/huanent/WebApi下面我来介绍下项目的细节一、项目结构项目主要分为三个文件夹application&n...
AspNetCore发布以来就持续关注,利用业余时间写了一个项目快速开发的项目模板,已托管到github,如果想直接看源码请戳下面

https://github.com/huanent/WebApi

下面我来介绍下项目的细节

一、项目结构

基于AspNetCore的领域驱动快速开发模板项目

项目主要分为三个文件夹

application     主要存放对外的项目,protal为一个webapi项目。对外提供web服务

domain          业务领域核心,其中存放项目业务的具体逻辑实现,并向application层提供接口调用

infrastructure     基础设施层,目前只实现文件日志一个项目,后期可依据项目需要拓展email等其他辅助服务

从startup文件分析整个项目

注入领域

基于AspNetCore的领域驱动快速开发模板项目

 

首先我们看到在ConfigureServices中注入Domain,也就是我们的核心业务逻辑,其中两个参数

1、sql服务类型

2,连接字符串

domain目前我使用两种数据库,小型项目使用sqlite,较大型使用sqlserver,直接传入枚举值指定即可,领域的详细实现会在下面详细讲解。

拓展文本日志

基于AspNetCore的领域驱动快速开发模板项目

 

 在Configure中官方默认的日志提供器提供了console和编辑器内调试的日志输出,在实际生产中我们更希望可以有文本形式的日志记录,所以我们在红框中添加了文本形式的文件记录提供器,具体的实现在infrastructure的Logging.TextWriter项目中。

 二、Damain领域层

DomainService.Abstractions

基于AspNetCore的领域驱动快速开发模板项目

 

此项目存放领域服务的service与repository接口,不做具体实现。并在protal的Controller中被获取和调用

基于AspNetCore的领域驱动快速开发模板项目

在RepositoryInterface和ServiceInterface中的接口需要实现base文件夹中各自对用的父接口,因为只有这样做才能自动被注入到系统的依赖容器中,其自动注入的实现将在项目DomainService.Implement中实现

 

DomainService.Implement

基于AspNetCore的领域驱动快速开发模板项目

 DomainService.Implement项目实现DomainService.Abstractions中的各各对应的仓储或服务接口,并继承base文件夹中各自的父类,例如DemoRepository类

public class DemoRepository : RepositoryBase<Demo>, IDemoRepository

这样实现的类会被自动绑定到IDemoRepository接口。实现自动绑定的方法在AddDomainExtention中

基于AspNetCore的领域驱动快速开发模板项目 View Code

如上,这个方法分别注册了repository和service,具体是通过反射来查找继承自指定父类的接口类型和实现类型,然后通过IServiceCollection添加注册

Entities、Entities.TypeConfig

基于AspNetCore的领域驱动快速开发模板项目

这两个项目为EF的实体定义与配置,entitis定义基本的实体类型

public class Demo : EntityBase
    {
        public string Name { get; set; }
    }

 

实体的约束,外键导航等在Entities.TypeConfig配置

复制代码
  public class DemoConfig : EntityTypeConfigBase<Demo>
    {
        /// <summary>
        /// 实体配置类
        /// 使用集成自父类的Builder进行配置
        /// 配置结果将会在程序启动时自动注入程序的DbContext
        /// </summary>
        public override void ConfigType()
        {
            Builder.Property(p => p.Name).HasMaxLength(10);
        }
    }
复制代码

在这两个项目中定义的实体,实体配置需要继承自各自的默认接口,这样就可以被EF自动注册到DBContext,具体实现在AppDbContext的OnModelCreating方法

复制代码
 protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            #region 注册实体类型配置

            var typeInfo = typeof(EntityTypeConfigBase<>).GetTypeInfo();
            string typeName = typeInfo.Name;
            var assembly = typeInfo.Assembly;
            var types = assembly.GetTypes();
            foreach (var item in types)
            {
                if (item.GetTypeInfo().BaseType.Name == typeName)
                {
                    dynamic instance = assembly.CreateInstance(item.FullName);
                    instance.ModelBuilder = modelBuilder;
                    instance.ConfigType();
                }
            }

            #endregion 注册实体类型配置

            base.OnModelCreating(modelBuilder);
        }
复制代码

使用方法

此模板使用起来很简单,以添加一个Product为例,流程如下

1.Entitis中添加Product类继承EntityBase

2.Entities.TypeConfig新增ProductConfig类继承EntityTypeConfigBase,配置Product具体字段约束,外键

3.DomainService.Abstractions新增IProductRepository实现IRepository

4.DomainService.Implement新增ProductRepository继承Repository<Product>实现IProductRepository

5.在Protal中的Controller中构造函数获得依赖IProductRepository并调用业务方法

总结

AspNetCore是一个非常优秀的平台,其中很多的设计模式都很值得我们去借鉴和学习,本人才疏学浅,但还算乐于学习,文章中有对概念理解不对的地方,欢迎批评指正,我也会虚心学习,希望我们可以共同努力,促进.net在中国的发展。


欢迎加入VIP,【VIP售价:只要288元永久VIP会员】畅享商业棋牌游戏程序下载,点击开通!

下载说明


☉本站所有源码和资源均由站长亲自测试-绝对保证都可以架设,运营!
☉如源码和资源有损坏或所有链接均不能下载,请告知管理员,

☉本站软件和源码大部分为站长独资,资源购买和收集,放心下载!

☉唯一站长QQ:1004003180  [人格担保-本站注重诚信!]

☉购买建议E-mail:1004003180@qq.com   源码收购 E-mail:1004003180@qq.com    

☉本站文件解压密码  【文章内都自带解压密码,每个密码不同!】


本站提供的所有源码,均来源站长提供,仅学习交流 浙ICP备09009969号

由此产生不良后果和法律责任与本站无关,如果侵犯了您的版权,请来信告知 1004003180@qq.com 将及时更正和删除! 

Copyright © 2008-2024 棋牌资源网,你身边的棋牌资源下载站    All Rights Reserved