引言
创建档案管理项目后端,实现附件的增删改查,引用abp vnext最佳实践。
创建Web Api项目
使用空Web应用程序创建项目。
1.创建Asp.net core 5 web api项目Hx.Archives.Api。
2.安装Nuget包:Volo.Abp.AspNetCore.Mvc
、Volo.Abp.Autofac
。
3.创建Module,添加依赖:[DependsOn(typeof(AbpAspNetCoreMvcModule))]
、[DependsOn(typeof(AbpAutofacModule))]
。
4.修改Startup类。
5.修改Program类。
6.添加swagger。
Module:
[DependsOn(typeof(AbpAspNetCoreMvcModule))]//添加依赖 [DependsOn(typeof(AbpAutofacModule))] public class HxArchivesApiModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) { //添加swagger服务 context.Services.AddSwaggerGen(options => { options.SwaggerDoc("v1", new OpenApiInfo { Title = "档案管理 Api", Version = "v0.1" }); options.DocInclusionPredicate((docName, description) => true); options.CustomSchemaIds(type => type.FullName); }); } public override void OnApplicationInitialization( ApplicationInitializationContext context) { var app = context.GetApplicationBuilder(); app.UseStaticFiles(); app.UseRouting(); app.UseSwagger(); app.UseSwaggerUI(options => { options.SwaggerEndpoint("/swagger/v1/swagger.json", "Identity Service API"); }); app.UseConfiguredEndpoints(); } }
Program:
public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }) .UseAutofac(); // 添加这一行 }
Startup:
public class Startup { public void ConfigureServices(IServiceCollection services) { services.AddApplication<HxArchivesApiModule>(); } public void Configure(IApplicationBuilder app) { app.InitializeApplication(); } }
创建领域层
1.创建(类库).NET Core项目,命名为Hx.Archives.Domain。
2.引入Nuget包:Volo.Abp.Ddd.Domain。
3.创建HxArchivesDomainModule,并引入依赖[DependsOn(typeof(AbpDddDomainModule))]。
创建实体AttachFile、AttachCatalogue,创建附件类型枚举:AttachTypeEnum。
HxArchivesDomainModule:
[DependsOn(typeof(AbpDddDomainModule))] public class HxArchivesDomainModule : AbpModule { }
AttachFile:
/// <summary> /// 附件文件 /// </summary> public class AttachFile : Entity<Guid> { /// <summary> /// 文件名称 /// </summary> public virtual string FileName { get; private set; } /// <summary> /// 文件别名 /// </summary> public virtual string FileAlias { get; private set; } /// <summary> /// 文件路径 /// </summary> public virtual string FilePath { get; private set; } /// <summary> /// 顺序号 /// </summary> public virtual int SequenceNumber { get; private set; } /// <summary> /// 文件内容 /// </summary> public virtual byte[] DocumentContent { get; private set; } /// <summary> /// 提供给ORM用来从数据库中获取实体, /// 无需初始化子集合因为它会被来自数据库的值覆盖 /// </summary> protected AttachFile() { } /// <summary> /// 创建附件文件,通过文件管理系统持久化 /// </summary> /// <param name="id"></param> /// <param name="aliasName"></param> /// <param name="sequenceNumber"></param> public AttachFile( Guid id, string aliasName, int sequenceNumber) { Id = id; SequenceNumber = sequenceNumber; FileAlias = aliasName; FileName = id.ToString(); } /// <summary> /// 创建附件文件,通过数据库持久化 /// </summary> /// <param name="id"></param> /// <param name="aliasName"></param> /// <param name="documentContent"></param> /// <param name="sequenceNumber"></param> public AttachFile( Guid id, string aliasName, byte[] documentContent, int sequenceNumber) { Id = id; SequenceNumber = sequenceNumber; FileAlias = aliasName; DocumentContent = documentContent; } }
AttachCatalogue:
/// <summary> /// 附件目录 /// </summary> public class AttachCatalogue : FullAuditedAggregateRoot<Guid> { /// <summary> /// 附件类型 /// </summary> public virtual AttachTypeEnum AttachType { get; private set; } /// <summary> /// 目录名称 /// </summary> public virtual string CatalogueName { get; private set; } /// <summary> /// 附件数量 /// </summary> public virtual int AttachCount { get; private set; } /// <summary> /// 页数 /// </summary> public virtual int PageCount { get; private set; } /// <summary> /// 是否核验 /// </summary> public virtual bool IsVerification { get; private set; } /// <summary> /// 是否必收 /// </summary> public virtual bool IsRequired { get; private set; } /// <summary> /// 顺序号 /// </summary> public virtual int SequenceNumber { get; private set; } /// <summary> /// 归档状态 /// </summary> public virtual bool ArchivingStatus { get; private set; } /// <summary> /// 附件文件集合 /// </summary> public virtual Collection<AttachFile> AttachFiles { get; private set; } /// <summary> /// 提供给ORM用来从数据库中获取实体, /// 无需初始化子集合因为它会被来自数据库的值覆盖 /// </summary> protected AttachCatalogue() { } public AttachCatalogue( Guid id, AttachTypeEnum attachTypeEnum, string catologueName, int sequenceNumber, Collection<AttachFile> attachFiles = null, bool isRequired = true, int attachCount = 0, int pageCount = 0 ) { Id = id; AttachType = attachTypeEnum; CatalogueName = catologueName; SequenceNumber = sequenceNumber; IsRequired = isRequired; AttachCount = attachCount; PageCount = pageCount; if (attachFiles == null) AttachFiles = new Collection<AttachFile>(); else AttachFiles = AttachFiles; } /// <summary> /// 验证 /// </summary> public void Verify() => IsVerification = true; /// <summary> /// 归档 /// </summary> public void Archiving() => ArchivingStatus = true; /// <summary> /// 添加附件 /// </summary> /// <param name="attach">文件</param> public void AddAttachFile(AttachFile attach) => AttachFiles.Add(attach); public void AddAttachFiles(Collection<AttachFile> attachFiles) => AttachFiles = attachFiles; }
AttachTypeEnum:
public enum AttachTypeEnum { /// <summary> /// 原件 /// </summary> OriginalScript = 1, /// <summary> ///复印件 /// </summary> Copy = 2, /// <summary> ///原件副本 /// </summary> Duplicate = 3, /// <summary> ///副本复印件 /// </summary> DuplicateCopy = 4, /// <summary> ///手稿 /// </summary> Manuscript = 5, /// <summary> ///原件或复印件 /// </summary> OriginalScriptOrCopy = 6, /// <summary> ///其它 /// </summary> Other = 99 }
创建数据访问EntityFrameworkCore
1.添加Nuget包:Volo.Abp.EntityFrameworkCore。
2.创建HxArchivesEntityFrameworkCoreModule,引入依赖:[DependsOn(typeof(AbpEntityFrameworkCoreModule))]、[DependsOn(typeof(HxArchivesDomainModule))]。
3.创建数据库上下文、上下文接口:ArchivesDbContext、IArchivesDbContext。
4.创建表名前缀及数据库模式。
5.创建ModelBuilder扩展类。
HxArchivesEntityFrameworkCoreModule:
[DependsOn(typeof(AbpEntityFrameworkCoreModule))] [DependsOn(typeof(HxArchivesDomainModule))] public class HxArchivesEntityFrameworkCoreModule : AbpModule { }
ArchivesDbContext:
[ConnectionStringName("HxArchives")] public class ArchivesDbContext : AbpDbContext<ArchivesDbContext>, IArchivesDbContext { public ArchivesDbContext(DbContextOptions<ArchivesDbContext> options) : base(options) { } }
IArchivesDbContext:
[ConnectionStringName("HxArhives")] public interface IArchivesDbContext : IEfCoreDbContext { }
ArchivesModelBuilderConfigurationOptions:
public class ArchivesModelBuilderConfigurationOptions : AbpModelBuilderConfigurationOptions { public ArchivesModelBuilderConfigurationOptions( [NotNull] string tablePrefix, [CanBeNull] string schema) : base(tablePrefix, schema) { } }