OsharpNS轻量级.net core快速开发框架简明入门教程-基于Osharp实现自己的业务功能...
OsharpNS輕量級(jí).net core快速開發(fā)框架簡(jiǎn)明入門教程
教程目錄
-
從零開始啟動(dòng)Osharp
1.1. 使用OsharpNS項(xiàng)目模板創(chuàng)建項(xiàng)目
1.2. 配置數(shù)據(jù)庫(kù)連接串并啟動(dòng)項(xiàng)目
1.3. OsharpNS.Swagger使用實(shí)例(登錄和授權(quán))
1.4. Angular6的前端項(xiàng)目啟動(dòng)
-
Osharp代碼生成器的使用
2.1 生成器的使用
2.2 生成代碼詳解(如何自己實(shí)現(xiàn)業(yè)務(wù)功能)
-
Osharp部分模塊使用
3.1 Osharp.Redis使用
3.2 Osharp.Hangfire使用
3.3 Osharp.Permissions使用
-
Osharp深度學(xué)習(xí)和使用
4.1 切換數(shù)據(jù)庫(kù)(從SqlServer改為MySql)
4.2 多上下文配置(多個(gè)數(shù)據(jù)庫(kù)的使用)
4.3. 自定義模塊的定義(Senparc.Weixin的使用)
4.4. 繼續(xù)學(xué)習(xí)中....
OsharpNS官方資源
項(xiàng)目地址:https://github.com/i66soft/osharp-ns20
演示地址:https://www.osharp.org 直接使用QQ登錄可以查看效果
文檔地址:https://docs.osharp.org 正在完善中....
發(fā)布博客:https://www.cnblogs.com/guomingfeng/p/osharpns-publish.html 大神看這個(gè)文檔應(yīng)該就能跑起來(lái),從零開始啟動(dòng)Osharp基于此文檔完成
VS生成器插件:https://marketplace.visualstudio.com/items?itemName=LiuliuSoft.osharp
官方交流QQ群:85895249
基于Osharp實(shí)現(xiàn)自己的業(yè)務(wù)功能
目錄
-
基于Osharp實(shí)現(xiàn)業(yè)務(wù)的編碼流程
-
Core模塊代碼
-
EntityConfiguration模塊代碼
-
WebApi模塊代碼
基于Osharp實(shí)現(xiàn)業(yè)務(wù)的編碼流程
本篇基于教程前面的項(xiàng)目和生成的代碼展開,CanDoo.Test是使用項(xiàng)目模板創(chuàng)建的項(xiàng)目命名空間,CMS是使用生成器創(chuàng)建的內(nèi)容管理模塊,如不明白,請(qǐng)看前面的教程。
-
根據(jù)業(yè)務(wù)需求,確定需要開發(fā)的模塊,和各個(gè)模塊需要的實(shí)體及實(shí)體屬性
-
根據(jù)業(yè)務(wù)需要分模塊定義實(shí)體屬性,位于
CanDoo.Test.Core/CMS/Entities -
根據(jù)實(shí)體的定義,完成實(shí)體各屬性的數(shù)據(jù)庫(kù)配置,位于
CanDoo.Test.EntityConfiguration/CMS/ -
根據(jù)業(yè)務(wù)需要定義輸入、輸出Dto,位于
CanDoo.Test.Core/CMS/Dtos -
根據(jù)業(yè)務(wù)需要定義此實(shí)體對(duì)應(yīng)的功能接口,位于
CanDoo.Test.Core/CMS -
根據(jù)業(yè)務(wù)需求實(shí)現(xiàn)功能,位于
CanDoo.Test.Core/CMS -
新建一個(gè)自定義模塊,完成接口和服務(wù)的依賴注入,位于
CanDoo.Test.Core/CMS -
新建一個(gè)控制器,調(diào)用對(duì)應(yīng)模塊的接口,定義對(duì)應(yīng)功能的WebApi,前端調(diào)用WebApi完成用戶界面,位于
CanDoo.Test.Web/Areas/Admin/Controllers/CMS -
下圖為接下去講解代碼在項(xiàng)目中的位置,很多文件以
.generated.cs,此文件為代碼自動(dòng)生成的模板代碼,實(shí)現(xiàn)了基礎(chǔ)的增刪改查操作,當(dāng)使用生成器重新生成代碼時(shí),此文件會(huì)被覆蓋,如果實(shí)現(xiàn)代碼需要改動(dòng),不建議直接在此文件上改動(dòng),建議新建一個(gè)文件,繼承自以.generated.cs結(jié)尾的文件,在新文件中改動(dòng)相關(guān)的實(shí)現(xiàn),從而避免重新生成代碼,導(dǎo)致自定義代碼被覆蓋
Core模塊代碼
接下去以CMS模塊中的Article為了來(lái)講解相關(guān)代碼
-
實(shí)體的定義:
EntityBase:定義了主鍵Id的類型為int
ILockable:定義可鎖定功能,需定義屬性:IsLocked
ISoftDeletable:定義邏輯刪除功能,需定義屬性:DeletedTime
ICreationAudited:定義創(chuàng)建審計(jì)信息,需定義屬性:CreatorId,CreatedTime
IUpdateAudited:定義更新審計(jì)信息,需定義屬性:LastUpdaterId,LastUpdatedTime
//------------------------------------------------------------------------------ // <auto-generated> // 此代碼由代碼生成器生成。 // 手動(dòng)更改此文件可能導(dǎo)致應(yīng)用程序出現(xiàn)意外的行為。 // 如果重新生成代碼,對(duì)此文件的任何修改都會(huì)丟失。 // 如果需要擴(kuò)展此類,請(qǐng)新建分部類 partial class Article 進(jìn)行擴(kuò)展 // </auto-generated> // // <copyright file="Article.generated.cs" company="杭州乾渡科技有限公司"> // Copyright 2019 乾渡科技出品 // </copyright> // <site>https://www.osharp.org</site> // <last-editor>atai</last-editor> // <last-date>2019-04-27 10:04</last-date> // -----------------------------------------------------------------------using System; using System.Collections.Generic; using System.ComponentModel;using OSharp.Entity;using CanDoo.Test.Identity.Entities;namespace CanDoo.Test.CMS.Entities{/// <summary>/// 實(shí)體類:文章信息/// </summary>[Description("文章信息")]public partial class Article : EntityBase<int>, ILockable, ISoftDeletable, ICreationAudited<int>, IUpdateAudited<int>{/// <summary>/// 獲取或設(shè)置 標(biāo)題/// </summary>[DisplayName("標(biāo)題")]public string Title { get; set; }/// <summary>/// 獲取或設(shè)置 內(nèi)容/// </summary>[DisplayName("內(nèi)容")]public string Content { get; set; }/// <summary>/// 獲取或設(shè)置 是否鎖定/// </summary>[DisplayName("是否鎖定")]public bool IsLocked { get; set; }/// <summary>/// 獲取或設(shè)置 刪除時(shí)間/// </summary>[DisplayName("刪除時(shí)間")]public DateTime? DeletedTime { get; set; }/// <summary>/// 獲取或設(shè)置 創(chuàng)建者/// </summary>[DisplayName("創(chuàng)建者")]public int? CreatorId { get; set; }/// <summary>/// 獲取或設(shè)置 創(chuàng)建時(shí)間/// </summary>[DisplayName("創(chuàng)建時(shí)間")]public DateTime CreatedTime { get; set; }/// <summary>/// 獲取或設(shè)置 更新者/// </summary>[DisplayName("更新者")]public int? LastUpdaterId { get; set; }/// <summary>/// 獲取或設(shè)置 更新時(shí)間/// </summary>[DisplayName("更新時(shí)間")]public DateTime? LastUpdatedTime { get; set; }/// <summary>/// 獲取或設(shè)置 分類外鍵/// </summary>[DisplayName("分類外鍵")]public int ArticleCategoryId { get; set; }/// <summary>/// 獲取或設(shè)置 發(fā)布人外鍵/// </summary>[DisplayName("發(fā)布人外鍵")]public int? UserId { get; set; }/// <summary>/// 獲取或設(shè)置 分類/// </summary>[DisplayName("分類")]public virtual ArticleCategory ArticleCategory { get; set; }/// <summary>/// 獲取或設(shè)置 發(fā)布人/// </summary>[DisplayName("發(fā)布人")]public virtual User User { get; set; }}} -
InputDto的定義:此Dto用于向系統(tǒng)輸入數(shù)據(jù)的時(shí)候,比如新增數(shù)據(jù),編輯數(shù)據(jù)時(shí),通過(guò)InputDto來(lái)提供數(shù)據(jù)
IInputDto:定義了主鍵類型為int
// ----------------------------------------------------------------------- // <auto-generated> // 此代碼由代碼生成器生成。 // 手動(dòng)更改此文件可能導(dǎo)致應(yīng)用程序出現(xiàn)意外的行為。 // 如果重新生成代碼,對(duì)此文件的任何修改都會(huì)丟失。 // 如果需要擴(kuò)展此類,請(qǐng)新建分部類 partial class ArticleInputDto 進(jìn)行擴(kuò)展 // </auto-generated> // // <copyright file="ArticleInputDto.generated.cs" company="杭州乾渡科技有限公司"> // Copyright 2019 乾渡科技出品 // </copyright> // <site>https://www.osharp.org</site> // <last-editor>atai</last-editor> // <last-date>2019-04-27 10:04</last-date> // -----------------------------------------------------------------------using System; using System.ComponentModel; using System.ComponentModel.DataAnnotations;using OSharp.Entity; using OSharp.Mapping;using CanDoo.Test.CMS.Entities;namespace CanDoo.Test.CMS.Dtos {/// <summary>/// 輸入DTO:文章信息/// </summary>[MapTo(typeof(Article))][Description("文章信息")]public partial class ArticleInputDto : IInputDto<int>{/// <summary>/// 獲取或設(shè)置 編號(hào)/// </summary>[DisplayName("編號(hào)")]public int Id { get; set; }/// <summary>/// 獲取或設(shè)置 分類外鍵/// </summary>[DisplayName("分類外鍵")]public int ArticleCategoryId { get; set; }/// <summary>/// 獲取或設(shè)置 標(biāo)題/// </summary>[DisplayName("標(biāo)題")]public string Title { get; set; }/// <summary>/// 獲取或設(shè)置 內(nèi)容/// </summary>[DisplayName("內(nèi)容")]public string Content { get; set; }/// <summary>/// 獲取或設(shè)置 發(fā)布人外鍵/// </summary>[DisplayName("發(fā)布人外鍵")]public int UserId { get; set; }/// <summary>/// 獲取或設(shè)置 是否鎖定/// </summary>[DisplayName("是否鎖定")]public bool IsLocked { get; set; }}} -
OutDto的定義:此Dto用于輸出數(shù)據(jù)給用戶時(shí)候,比如數(shù)據(jù)列表展示,展示數(shù)據(jù)詳情的時(shí)候,通過(guò)OutDto來(lái)提供數(shù)據(jù)
IDataAuthEnabled:定義數(shù)據(jù)權(quán)限的允許更新,允許刪除狀態(tài),需定義:Updatable,Deletable
// ----------------------------------------------------------------------- // <auto-generated> // 此代碼由代碼生成器生成。 // 手動(dòng)更改此文件可能導(dǎo)致應(yīng)用程序出現(xiàn)意外的行為。 // 如果重新生成代碼,對(duì)此文件的任何修改都會(huì)丟失。 // 如果需要擴(kuò)展此類,請(qǐng)新建分部類 partial class ArticleOutputDto 進(jìn)行擴(kuò)展 // </auto-generated> // // <copyright file="ArticleOutputDto.generated.cs" company="杭州乾渡科技有限公司"> // Copyright 2019 乾渡科技出品 // </copyright> // <site>https://www.osharp.org</site> // <last-editor>atai</last-editor> // <last-date>2019-04-27 10:04</last-date> // -----------------------------------------------------------------------using System; using System.ComponentModel; using System.ComponentModel.DataAnnotations;using OSharp.Entity; using OSharp.Mapping;using CanDoo.Test.CMS.Entities; using CanDoo.Test.Identity.Entities;namespace CanDoo.Test.CMS.Dtos {/// <summary>/// 輸入DTO:文章信息/// </summary>[MapFrom(typeof(Article))][Description("文章信息")]public partial class ArticleOutputDto : IOutputDto, IDataAuthEnabled{/// <summary>/// 獲取或設(shè)置 編號(hào)/// </summary>[DisplayName("編號(hào)")]public int Id { get; set; }/// <summary>/// 獲取或設(shè)置 分類/// </summary>[DisplayName("分類")]public ArticleCategory ArticleCategory { get; set; }/// <summary>/// 獲取或設(shè)置 標(biāo)題/// </summary>[DisplayName("標(biāo)題")]public string Title { get; set; }/// <summary>/// 獲取或設(shè)置 內(nèi)容/// </summary>[DisplayName("內(nèi)容")]public string Content { get; set; }/// <summary>/// 獲取或設(shè)置 發(fā)布人/// </summary>[DisplayName("發(fā)布人")]public User User { get; set; }/// <summary>/// 獲取或設(shè)置 是否鎖定/// </summary>[DisplayName("是否鎖定")]public bool IsLocked { get; set; }/// <summary>/// 獲取或設(shè)置 創(chuàng)建者/// </summary>[DisplayName("創(chuàng)建者")]public int CreatorId { get; set; }/// <summary>/// 獲取或設(shè)置 創(chuàng)建時(shí)間/// </summary>[DisplayName("創(chuàng)建時(shí)間")]public DateTime CreatedTime { get; set; }/// <summary>/// 獲取或設(shè)置 更新者/// </summary>[DisplayName("更新者")]public int LastUpdaterId { get; set; }/// <summary>/// 獲取或設(shè)置 更新時(shí)間/// </summary>[DisplayName("更新時(shí)間")]public DateTime LastUpdatedTime { get; set; }/// <summary>/// 獲取或設(shè)置 是否可更新的數(shù)據(jù)權(quán)限狀態(tài)/// </summary>public bool Updatable { get; set; }/// <summary>/// 獲取或設(shè)置 是否可刪除的數(shù)據(jù)權(quán)限狀態(tài)/// </summary>public bool Deletable { get; set; }}} -
接口的定義:定義需要的接口
// ----------------------------------------------------------------------- // <auto-generated> // 此代碼由代碼生成器生成。 // 手動(dòng)更改此文件可能導(dǎo)致應(yīng)用程序出現(xiàn)意外的行為。 // 如果重新生成代碼,對(duì)此文件的任何修改都會(huì)丟失。 // 如果需要擴(kuò)展此接口,請(qǐng)新建分部接口 partial interface ICMSContract 添加新的方法,并添加相應(yīng)新的分部基類 abstract partial class CMSServiceBase 實(shí)現(xiàn)新方法 // </auto-generated> // // <copyright file="ICMSContract.generated.cs" company="杭州乾渡科技有限公司"> // Copyright 2019 乾渡科技出品 // </copyright> // <site>https://www.osharp.org</site> // <last-editor>atai</last-editor> // <last-date>2019-04-27 10:04</last-date> // -----------------------------------------------------------------------using System; using System.Linq; using System.Linq.Expressions; using System.Threading.Tasks;using OSharp.Data; using OSharp.Extensions;using CanDoo.Test.CMS.Dtos; using CanDoo.Test.CMS.Entities;namespace CanDoo.Test.CMS {/// <summary>/// 業(yè)務(wù)契約接口:內(nèi)容管理模塊/// </summary>public partial interface ICMSContract{#region 文章分類信息業(yè)務(wù)#endregion#region 文章信息業(yè)務(wù)/// <summary>/// 獲取 文章信息查詢數(shù)據(jù)集/// </summary>IQueryable<Article> Articles { get; }/// <summary>/// 檢查文章信息信息是否存在/// </summary>/// <param name="predicate">檢查謂語(yǔ)表達(dá)式</param>/// <param name="id">更新的文章信息編號(hào)</param>/// <returns>文章信息是否存在</returns>Task<bool> CheckArticleExists(Expression<Func<Article, bool>> predicate, int id = default(int));/// <summary>/// 添加文章信息信息/// </summary>/// <param name="dtos">要添加的文章信息DTO信息</param>/// <returns>業(yè)務(wù)操作結(jié)果</returns>Task<OperationResult> CreateArticles(params ArticleInputDto[] dtos);/// <summary>/// 更新文章信息信息/// </summary>/// <param name="dtos">包含更新信息的文章信息DTO信息</param>/// <returns>業(yè)務(wù)操作結(jié)果</returns>Task<OperationResult> UpdateArticles(params ArticleInputDto[] dtos);/// <summary>/// 刪除文章信息信息/// </summary>/// <param name="ids">要?jiǎng)h除的文章信息編號(hào)</param>/// <returns>業(yè)務(wù)操作結(jié)果</returns>Task<OperationResult> DeleteArticles(params int[] ids);#endregion#region 留言板信息業(yè)務(wù)#endregion}} -
功能實(shí)現(xiàn):因?yàn)橐粋€(gè)功能模塊中會(huì)有大量的實(shí)體,系統(tǒng)中將各個(gè)實(shí)體的具體實(shí)現(xiàn)進(jìn)行了文件的拆分,從前面的圖中可以看出,Article的具體實(shí)現(xiàn)位于
CMSServiceBase.Article.generated.cs,CMSServiceBase.generated.cs定義了CMS模塊所有需要使用到的對(duì)象,CMSService.cs為模塊的業(yè)務(wù)實(shí)現(xiàn)基類
// -----------------------------------------------------------------------// <auto-generated>// 此代碼由代碼生成器生成。// 手動(dòng)更改此文件可能導(dǎo)致應(yīng)用程序出現(xiàn)意外的行為。// 如果重新生成代碼,對(duì)此文件的任何修改都會(huì)丟失。// 如果需要擴(kuò)展此類,可以遵守如下規(guī)則進(jìn)行擴(kuò)展:// 1.橫向擴(kuò)展:如需給當(dāng)前實(shí)體 Article 添加方法,可新建文件“CMSServiceBase.Article.cs”的分部類“public abstract partial class CMSServiceBase”添加功能// 2.縱向擴(kuò)展:如需要重寫當(dāng)前實(shí)體 Article 的業(yè)務(wù)實(shí)現(xiàn),可新建文件“CMSService.Article.cs”的分部類“public partial class CMSService”對(duì)現(xiàn)有方法進(jìn)行方法重寫實(shí)現(xiàn)// </auto-generated>//// <copyright file="CMSServiceBase.Article.generated.cs" company="杭州乾渡科技有限公司">// Copyright 2019 乾渡科技出品// </copyright>// <site>https://www.osharp.org</site>// <last-editor>atai</last-editor>// <last-date>2019-04-27 10:04</last-date>// -----------------------------------------------------------------------using System;using System.Linq;using System.Linq.Expressions;using System.Threading.Tasks;using OSharp.Data;using OSharp.Dependency;using OSharp.Extensions;using OSharp.Mapping;using CanDoo.Test.CMS.Dtos;using CanDoo.Test.CMS.Entities;namespace CanDoo.Test.CMS{public abstract partial class CMSServiceBase{/// <summary>/// 獲取 文章信息查詢數(shù)據(jù)集/// </summary>public IQueryable<Article> Articles{get { return ArticleRepository.Query(); }}/// <summary>/// 檢查文章信息是否存在/// </summary>/// <param name="predicate">檢查謂語(yǔ)表達(dá)式</param>/// <param name="id">更新的文章信息編號(hào)</param>/// <returns>文章信息是否存在</returns>public virtual Task<bool> CheckArticleExists(Expression<Func<Article, bool>> predicate, int id = default(int)){return ArticleRepository.CheckExistsAsync(predicate, id);}/// <summary>/// 添加文章信息/// </summary>/// <param name="dtos">要添加的文章信息DTO信息</param>/// <returns>業(yè)務(wù)操作結(jié)果</returns>public virtual Task<OperationResult> CreateArticles(params ArticleInputDto[] dtos){Check.NotNull(dtos, nameof(dtos));return ArticleRepository.InsertAsync(dtos);}/// <summary>/// 更新文章信息/// </summary>/// <param name="dtos">包含更新信息的文章信息DTO信息</param>/// <returns>業(yè)務(wù)操作結(jié)果</returns>public virtual Task<OperationResult> UpdateArticles(params ArticleInputDto[] dtos){Check.NotNull(dtos, nameof(dtos));return ArticleRepository.UpdateAsync(dtos);}/// <summary>/// 刪除文章信息/// </summary>/// <param name="ids">要?jiǎng)h除的文章信息編號(hào)</param>/// <returns>業(yè)務(wù)操作結(jié)果</returns>public virtual Task<OperationResult> DeleteArticles(params int[] ids){Check.NotNull(ids, nameof(ids));return ArticleRepository.DeleteAsync(ids);}}}
// -----------------------------------------------------------------------// <auto-generated>// 此代碼由代碼生成器生成。// 手動(dòng)更改此文件可能導(dǎo)致應(yīng)用程序出現(xiàn)意外的行為。// 如果重新生成代碼,對(duì)此文件的任何修改都會(huì)丟失。// 如果需要擴(kuò)展此類,請(qǐng)?jiān)诳刂破黝愋?CMSService 進(jìn)行繼承重寫// </auto-generated>//// <copyright file="ICMSServiceBase.generated.cs" company="杭州乾渡科技有限公司">// Copyright 2019 乾渡科技出品// </copyright>// <site>https://www.osharp.org</site>// <last-editor>atai</last-editor>// <last-date>2019-04-27 10:04</last-date>// -----------------------------------------------------------------------using System;using System.Linq;using System.Threading.Tasks;using OSharp.Core.Systems;using OSharp.Data;using OSharp.Entity;using OSharp.EventBuses;using OSharp.Extensions;using OSharp.Identity;using Microsoft.Extensions.DependencyInjection;using Microsoft.Extensions.Logging;using CanDoo.Test.CMS.Dtos;using CanDoo.Test.CMS.Entities;namespace CanDoo.Test.CMS{/// <summary>/// 業(yè)務(wù)實(shí)現(xiàn)基類:內(nèi)容管理模塊/// </summary>public abstract partial class CMSServiceBase : ICMSContract{/// <summary>/// 初始化一個(gè)<see cref="CMSService"/>類型的新實(shí)例/// </summary>protected CMSServiceBase(IServiceProvider provider){ServiceProvider = provider;Logger = provider.GetLogger(GetType());}#region 屬性/// <summary>/// 獲取或設(shè)置 服務(wù)提供者對(duì)象/// </summary>protected IServiceProvider ServiceProvider { get; }/// <summary>/// 獲取或設(shè)置 日志對(duì)象/// </summary>protected ILogger Logger { get; }/// <summary>/// 獲取或設(shè)置 文章分類信息倉(cāng)儲(chǔ)對(duì)象/// </summary>protected IRepository<ArticleCategory, int> ArticleCategoryRepository => ServiceProvider.GetService<IRepository<ArticleCategory, int>>();/// <summary>/// 獲取或設(shè)置 文章信息倉(cāng)儲(chǔ)對(duì)象/// </summary>protected IRepository<Article, int> ArticleRepository => ServiceProvider.GetService<IRepository<Article, int>>();/// <summary>/// 獲取或設(shè)置 留言板信息倉(cāng)儲(chǔ)對(duì)象/// </summary>protected IRepository<MessageBoard, int> MessageBoardRepository => ServiceProvider.GetService<IRepository<MessageBoard, int>>();/// <summary>/// 獲取 事件總線/// </summary>protected IEventBus EventBus => ServiceProvider.GetService<IEventBus>();/// <summary>/// 獲取 設(shè)置存儲(chǔ)對(duì)象/// </summary>protected IKeyValueStore KeyValueStore => ServiceProvider.GetService<IKeyValueStore>();#endregion}}
// -----------------------------------------------------------------------// <once-generated>// 這個(gè)文件只生成一次,再次生成不會(huì)被覆蓋。// 可以在此類進(jìn)行繼承重寫來(lái)擴(kuò)展基類 CMSServiceBase// </once-generated>//// <copyright file="ICMSService.cs" company="Qiadoo">// 隨便用// </copyright>// <site>http://www.qiadoo.com</site>// <last-editor>atai</last-editor>// <last-date>2019-04-26 13:52</last-date>// -----------------------------------------------------------------------using System;namespace CanDoo.Test.CMS{/// <summary>/// 業(yè)務(wù)實(shí)現(xiàn)基類:內(nèi)容管理模塊/// </summary>public partial class CMSService : CMSServiceBase{/// <summary>/// 初始化一個(gè)<see cref="CMSService"/>類型的新實(shí)例/// </summary>public CMSService(IServiceProvider provider): base(provider){ }}}
-
模塊定義:將模塊服務(wù)添加到依賴注入服務(wù)容器中
OsharpPack:系統(tǒng)啟動(dòng)的時(shí)候會(huì)自動(dòng)查找繼承自O(shè)sharpPack的模塊,完成加載
// ----------------------------------------------------------------------- // <auto-generated> // 此代碼由代碼生成器生成。 // 手動(dòng)更改此文件可能導(dǎo)致應(yīng)用程序出現(xiàn)意外的行為。 // 如果重新生成代碼,對(duì)此文件的任何修改都會(huì)丟失。 // 如果需要擴(kuò)展此類,請(qǐng)新建分部類 partial class CMSPack 進(jìn)行實(shí)現(xiàn)分部方法 AddServicesAppend,UsePackAppend 進(jìn)行擴(kuò)展 // </auto-generated> // // <copyright file="ICMSPack.generated.cs" company="杭州乾渡科技有限公司"> // Copyright 2019 乾渡科技出品 // </copyright> // <site>https://www.osharp.org</site> // <last-editor>atai</last-editor> // <last-date>2019-04-27 10:04</last-date> // -----------------------------------------------------------------------using System; using System.ComponentModel;using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions;using OSharp.Core.Packs;namespace CanDoo.Test.CMS {/// <summary>/// 內(nèi)容管理模塊/// </summary>[Description("內(nèi)容管理模塊")]public partial class CMSPack : OsharpPack{/// <summary>將模塊服務(wù)添加到依賴注入服務(wù)容器中</summary>/// <param name="services">依賴注入服務(wù)容器</param>/// <returns></returns>public override IServiceCollection AddServices(IServiceCollection services){services.TryAddScoped<ICMSContract, CMSService>();AddServicesAppend(services);return services;}/// <summary>/// 額外的服務(wù)注冊(cè)/// </summary>/// <param name="services">依賴注入服務(wù)容器</param>partial void AddServicesAppend(IServiceCollection services);/// <summary>/// 應(yīng)用模塊服務(wù)/// </summary>/// <param name="provider">服務(wù)提供者</param>public override void UsePack(IServiceProvider provider){UsePackAppend(provider);base.UsePack(provider);}/// <summary>/// 額外的服務(wù)注冊(cè)/// </summary>/// <param name="provider">服務(wù)提供者</param>partial void UsePackAppend(IServiceProvider provider);}}
EntityConfiguration模塊代碼解析
直接貼代碼了,在這里完成了各個(gè)屬性的數(shù)據(jù)庫(kù)配置,以下2行都是多對(duì)一的配置,第一條是文章和文章分類實(shí)現(xiàn)雙向?qū)Ш?#xff0c;第二條是文章和用戶的單向?qū)Ш?#xff0c;當(dāng)然在這里還能指定表的名稱等等,反正數(shù)據(jù)庫(kù)想怎么配置就在這里折騰吧
builder.HasOne<ArticleCategory>(m => m.ArticleCategory).WithMany(n => n.Articles).HasForeignKey(m => m.ArticleCategoryId).IsRequired().OnDelete(DeleteBehavior.Restrict);
builder.HasOne<User>(m => m.User).WithMany().HasForeignKey(m => m.UserId).IsRequired().OnDelete(DeleteBehavior.Restrict);
//------------------------------------------------------------------------------
// <auto-generated>
// 此代碼由代碼生成器生成。
// 手動(dòng)更改此文件可能導(dǎo)致應(yīng)用程序出現(xiàn)意外的行為。
// 如果重新生成代碼,對(duì)此文件的任何修改都會(huì)丟失。
// 如果需要擴(kuò)展此類,請(qǐng)新建分部類 partial class ArticleConfiguration 實(shí)現(xiàn)分部方法 EntityConfigurationAppend 進(jìn)行擴(kuò)展
// </auto-generated>
//
// <copyright file="ArticleConfiguration.generated.cs" company="杭州乾渡科技有限公司">
// Copyright 2019 乾渡科技出品
// </copyright>
// <site>https://www.osharp.org</site>
// <last-editor>atai</last-editor>
// <last-date>2019-04-27 10:04</last-date>
// -----------------------------------------------------------------------using System;using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;using OSharp.Entity;using CanDoo.Test.CMS.Entities;
using CanDoo.Test.Identity.Entities;namespace CanDoo.Test.EntityConfiguration.CMS
{/// <summary>/// 實(shí)體配置類:文章信息/// </summary>public partial class ArticleConfiguration : EntityTypeConfigurationBase<Article, int>{/// <summary>/// 重寫以實(shí)現(xiàn)實(shí)體類型各個(gè)屬性的數(shù)據(jù)庫(kù)配置/// </summary>/// <param name="builder">實(shí)體類型創(chuàng)建器</param>public override void Configure(EntityTypeBuilder<Article> builder){builder.HasOne<ArticleCategory>(m => m.ArticleCategory).WithMany(n => n.Articles).HasForeignKey(m => m.ArticleCategoryId).IsRequired().OnDelete(DeleteBehavior.Restrict);builder.HasOne<User>(m => m.User).WithMany().HasForeignKey(m => m.UserId).IsRequired().OnDelete(DeleteBehavior.Restrict);EntityConfigurationAppend(builder);}/// <summary>/// 額外的數(shù)據(jù)映射/// </summary>partial void EntityConfigurationAppend(EntityTypeBuilder<Article> builder);}}
WebApi模塊代碼
還是沒(méi)啥說(shuō)的,自己看代碼吧,注意看下對(duì)AdminApiController的繼承,
// -----------------------------------------------------------------------
// <copyright file="AdminApiController.cs" company="OSharp開源團(tuán)隊(duì)">
// Copyright (c) 2014-2018 OSharp. All rights reserved.
// </copyright>
// <site>http://www.osharp.org</site>
// <last-editor>郭明鋒</last-editor>
// <last-date>2018-06-27 4:50</last-date>
// -----------------------------------------------------------------------using Microsoft.AspNetCore.Mvc;using OSharp.AspNetCore.Mvc;
using OSharp.Core;namespace CanDoo.Test.Web.Areas.Admin.Controllers
{[Area("Admin")][RoleLimit]//繼承了這個(gè),就會(huì)進(jìn)行權(quán)限檢查public abstract class AdminApiController : AreaApiController{ }}
// -----------------------------------------------------------------------
// <auto-generated>
// 此代碼由代碼生成器生成。
// 手動(dòng)更改此文件可能導(dǎo)致應(yīng)用程序出現(xiàn)意外的行為。
// 如果重新生成代碼,對(duì)此文件的任何修改都會(huì)丟失。
// 如果需要擴(kuò)展此類,請(qǐng)?jiān)诳刂破黝愋?ArticleController 進(jìn)行繼承重寫
// </auto-generated>
//
// <copyright file="ArticleBase.generated.cs" company="杭州乾渡科技有限公司">
// Copyright 2019 乾渡科技出品
// </copyright>
// <site>https://www.osharp.org</site>
// <last-editor>atai</last-editor>
// <last-date>2019-04-27 10:04</last-date>
// -----------------------------------------------------------------------using System;
using System.ComponentModel;
using System.Linq;
using System.Linq.Expressions;
using System.Threading.Tasks;using Microsoft.AspNetCore.Mvc;using OSharp.AspNetCore.Mvc;
using OSharp.AspNetCore.Mvc.Filters;
using OSharp.AspNetCore.UI;
using OSharp.Caching;
using OSharp.Core.Functions;
using OSharp.Core.Modules;
using OSharp.Data;
using OSharp.Entity;
using OSharp.Filter;
using OSharp.Secutiry;using CanDoo.Test.CMS;
using CanDoo.Test.CMS.Dtos;
using CanDoo.Test.CMS.Entities;namespace CanDoo.Test.Web.Areas.Admin.Controllers
{/// <summary>/// 管理控制器基類: 文章信息/// </summary>[ModuleInfo(Position = "CMS", PositionName = "內(nèi)容管理模塊")][Description("管理-文章信息")]public abstract class ArticleControllerBase : AdminApiController{/// <summary>/// 初始化一個(gè)<see cref="ArticleController"/>類型的新實(shí)例/// </summary>protected ArticleControllerBase(ICMSContract cMSContract,IFilterService filterService){CMSContract = cMSContract;FilterService = filterService;}/// <summary>/// 獲取或設(shè)置 數(shù)據(jù)過(guò)濾服務(wù)對(duì)象/// </summary>protected IFilterService FilterService { get; }/// <summary>/// 獲取或設(shè)置 內(nèi)容管理模塊業(yè)務(wù)契約對(duì)象/// </summary>protected ICMSContract CMSContract { get; }/// <summary>/// 讀取文章列表信息/// </summary>/// <param name="request">頁(yè)請(qǐng)求信息</param>/// <returns>文章列表分頁(yè)信息</returns>[HttpPost][ModuleInfo][Description("讀取")]public virtual PageData<ArticleOutputDto> Read(PageRequest request){Check.NotNull(request, nameof(request));Expression<Func<Article, bool>> predicate = FilterService.GetExpression<Article>(request.FilterGroup);var page = CMSContract.Articles.ToPage<Article, ArticleOutputDto>(predicate, request.PageCondition);return page.ToPageData();}/// <summary>/// 新增文章信息/// </summary>/// <param name="dtos">文章信息輸入DTO</param>/// <returns>JSON操作結(jié)果</returns>[HttpPost][ModuleInfo][DependOnFunction("Read")][ServiceFilter(typeof(UnitOfWorkAttribute))][Description("新增")]public virtual async Task<AjaxResult> Create(ArticleInputDto[] dtos){Check.NotNull(dtos, nameof(dtos));OperationResult result = await CMSContract.CreateArticles(dtos);return result.ToAjaxResult();}/// <summary>/// 更新文章信息/// </summary>/// <param name="dtos">文章信息輸入DTO</param>/// <returns>JSON操作結(jié)果</returns>[HttpPost][ModuleInfo][DependOnFunction("Read")][ServiceFilter(typeof(UnitOfWorkAttribute))][Description("更新")]public virtual async Task<AjaxResult> Update(ArticleInputDto[] dtos){Check.NotNull(dtos, nameof(dtos));OperationResult result = await CMSContract.UpdateArticles(dtos);return result.ToAjaxResult();}/// <summary>/// 刪除文章信息/// </summary>/// <param name="ids">文章信息編號(hào)</param>/// <returns>JSON操作結(jié)果</returns>[HttpPost][ModuleInfo][DependOnFunction("Read")][ServiceFilter(typeof(UnitOfWorkAttribute))][Description("刪除")]public virtual async Task<AjaxResult> Delete(int[] ids){Check.NotNull(ids, nameof(ids));OperationResult result = await CMSContract.DeleteArticles(ids);return result.ToAjaxResult();}}}
// -----------------------------------------------------------------------
// <once-generated>
// 這個(gè)文件只生成一次,再次生成不會(huì)被覆蓋。
// 可以在此類進(jìn)行繼承重寫來(lái)擴(kuò)展基類 ArticleControllerBase
// </once-generated>
//
// <copyright file="Article.cs" company="Qiadoo">
// 隨便用
// </copyright>
// <site>http://www.qiadoo.com</site>
// <last-editor>atai</last-editor>
// <last-date>2019-04-26 13:52</last-date>
// -----------------------------------------------------------------------using System;using OSharp.Filter;using CanDoo.Test.CMS;namespace CanDoo.Test.Web.Areas.Admin.Controllers
{/// <summary>/// 管理控制器: 文章信息/// </summary>public class ArticleController : ArticleControllerBase{/// <summary>/// 初始化一個(gè)<see cref="ArticleController"/>類型的新實(shí)例/// </summary>public ArticleController(ICMSContract cMSContract,IFilterService filterService): base(cMSContract, filterService){ }}
}
轉(zhuǎn)載于:https://www.cnblogs.com/candoo/p/10782102.html
閱讀世界,共赴山海423全民讀書節(jié),邀你共讀
總結(jié)
以上是生活随笔為你收集整理的OsharpNS轻量级.net core快速开发框架简明入门教程-基于Osharp实现自己的业务功能...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: linux下vmware12不能3D加速
- 下一篇: FC(nes)游戏开发资源