https://github.com/huanent/WebApi
下面我来介绍下项目的细节
项目主要分为三个文件夹
application 主要存放对外的项目,protal为一个webapi项目。对外提供web服务
domain 业务领域核心,其中存放项目业务的具体逻辑实现,并向application层提供接口调用
infrastructure 基础设施层,目前只实现文件日志一个项目,后期可依据项目需要拓展email等其他辅助服务
首先我们看到在ConfigureServices中注入Domain,也就是我们的核心业务逻辑,其中两个参数
1、sql服务类型
2,连接字符串
domain目前我使用两种数据库,小型项目使用sqlite,较大型使用sqlserver,直接传入枚举值指定即可,领域的详细实现会在下面详细讲解。
在Configure中官方默认的日志提供器提供了console和编辑器内调试的日志输出,在实际生产中我们更希望可以有文本形式的日志记录,所以我们在红框中添加了文本形式的文件记录提供器,具体的实现在infrastructure的Logging.TextWriter项目中。
此项目存放领域服务的service与repository接口,不做具体实现。并在protal的Controller中被获取和调用
在RepositoryInterface和ServiceInterface中的接口需要实现base文件夹中各自对用的父接口,因为只有这样做才能自动被注入到系统的依赖容器中,其自动注入的实现将在项目DomainService.Implement中实现
DomainService.Implement项目实现DomainService.Abstractions中的各各对应的仓储或服务接口,并继承base文件夹中各自的父类,例如DemoRepository类
public class DemoRepository : RepositoryBase<Demo>, IDemoRepository
这样实现的类会被自动绑定到IDemoRepository接口。实现自动绑定的方法在AddDomainExtention中
如上,这个方法分别注册了repository和service,具体是通过反射来查找继承自指定父类的接口类型和实现类型,然后通过IServiceCollection添加注册
这两个项目为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在中国的发展。
下载说明
☉本站所有源码和资源均由站长亲自测试-绝对保证都可以架设,运营!
☉如源码和资源有损坏或所有链接均不能下载,请告知管理员,
☉本站软件和源码大部分为站长独资,资源购买和收集,放心下载!
☉唯一站长QQ:1004003180 [人格担保-本站注重诚信!]
☉购买建议E-mail:1004003180@qq.com 源码收购 E-mail:1004003180@qq.com
☉本站文件解压密码 【文章内都自带解压密码,每个密码不同!】