.NetCore 下開發獨立的(RPL)含有介面的元件包 (六)實現業務功能
.NetCore 下開發獨立的(RPL)含有介面的元件包 (一)準備工作
.NetCore 下開發獨立的(RPL)含有介面的元件包 (二)擴充套件中介軟體及服 務
.NetCore 下開發獨立的(RPL)含有介面的元件包 (三)構建介面
.NetCore 下開發獨立的(RPL)含有介面的元件包 (四)授權過濾
.NetCore 下開發獨立的(RPL)含有介面的元件包 (五)授權過濾引數處 理
.NetCore 下開發獨立的(RPL)含有介面的元件包 (六)實現業務功能
這裡們來做一個簡單的業務列表功能,這裡我就先來做一個Cient列表
一如以往,先新增頁面
當然需要在介面上寫上我們的列表語法,razorview會處理@符號的後臺程式碼,這裡我們制定了我們的資料來源是dataSoure,當然這裡是會報錯的,但是沒關係,因為最後執行都是ClientsIndex.Designer.cs類
@foreach (var item in dataSource) { <tr> <td> <div class="layui-unselect layui-form-checkbox" lay-skin="primary" data-id='@item.ClientId'><i class="layui-icon"></i></div> </td> <td>@item.ClientName</td> <td class="td-manage"> <a href="javascript:;" title="編輯" ><i class="layui-icon"> </i>編輯</a> <a href="javascript:;" title="刪除" ><i class="layui-icon"> </i>刪除</a> </td> </tr> }
執行命令 dotnet razorpagegenerator IdentityServer4.AdminChina 生成下檢視
可以看到生成是檢視程式碼,淡然這裡的dataSource是找不到的,可以在檢視上加上一些名稱空間的引用以及寫好的服務的操作程式碼,後面就不需要在檢視類中去修改了
foreach (var item in dataSource) { #line default #line hidden WriteLiteral(" <tr>\r\n <td>\r\n <div class=\"layui-unselect layui-form-checkbox\" lay-skin=\"primary\" data-id=\'"); #line 56 "ClientsIndex.cshtml" Write(item.ClientId); #line default #line hidden WriteLiteral("\'><i class=\"layui-icon\"></i></div>\r\n </td>\r\n <td>"); #line 58 "ClientsIndex.cshtml" Write(item.ClientName); #line default #line hidden WriteLiteral(@"</td> <td class=""td-manage""> <a href=""javascript:;"" title=""編輯"" ><i class=""layui-icon""> </i>編輯</a> <a href=""javascript:;"" title=""刪除"" ><i class=""layui-icon""> </i>刪除</a> </td> </tr> ");
下面就們就來為我們的dataSource做準備了
構建服務相關類
介面中定義個獲取資料的方法
public interface ICustomClientServies { List<ClientModel> GetClients(); }
public class CustomClientServies : ICustomClientServies { //private readonly XXXDbContext _dbContext //public CustomClientServies(XXXDbContext dbContext) //{ // _dbContext = dbContext; //} public List<ClientModel> GetClients() { return new List<ClientModel> { new ClientModel{ ClientId=1, ClientName="Implicit" }, new ClientModel{ ClientId=2,ClientName="Hybrid" }, new ClientModel{ClientId=3, ClientName="ClientCredintials" }, new ClientModel{ClientId=4, ClientName="AuthorizationCode" }, }; } }
這裡實現我就不操作資料庫了,如果需要操作資料庫或者使用IdentityServer4的上下文物件都是可以的,如上面註釋部分一樣,這裡新增幾條模擬資料,寫了這些還不夠,我們還需要將我們的Client服務DI
所以這裡我們還需要擴充套件IServiceCollection物件,這裡我們在擴充套件類中新增這個擴充套件,淡然你也可以寫對IIdentityServerBuilder(IdentityServer4)的擴充套件
public static IServiceCollection AddAdminChina(this IServiceCollection services) { services.AddScoped<ICustomClientServies, CustomClientServies>(); return services; }
接下來我們來檢視類中處理我們的服務類,說到這裡我們來看下BaseView這個檢視基類裡面都有什麼?
protected HttpContext Context { get; private set; } /// <summary> /// The request /// </summary> protected HttpRequest Request { get; private set; } /// <summary> /// The response /// </summary> public HttpResponse Response { get; private set; }
下面這三個物件都是BaseView提供給我們的,而我們的檢視類繼承了這個基類,所以可以想到從RequestServices拿到服務就輕而易舉了,接下來修改程式碼,在檢視類中新增對datasource的構造,這樣資料就應該沒有問題了,我種類就寫一個列表了,當然如果你要分頁,接受引數 ,判斷 獲取身份資訊狀態等等都能搞定,就因為有上面的上個物件,當然如果你中介軟體獲取了使用使用者的敏感資訊,那麼你這個中介軟體肯定就不安全了,比如你獲取access_token之類的操作
var services = Request.HttpContext.RequestServices.GetService(typeof(ICustomClientServies)) as ICustomClientServies; var dataSource = services.GetClients();
var services = Request.HttpContext.RequestServices.GetService(typeof(ICustomClientServies)) as ICustomClientServies; var dataSource = services.GetClients(); foreach (var item in dataSource) { #line default #line hidden WriteLiteral(" <tr>\r\n <td>\r\n <div class=\"layui-unselect layui-form-checkbox\" lay-skin=\"primary\" data-id=\'"); #line 58 "ClientsIndex.cshtml" Write(item.ClientId); #line default #line hidden WriteLiteral("\'><i class=\"layui-icon\"></i></div>\r\n </td>\r\n <td>"); #line 60 "ClientsIndex.cshtml" Write(item.ClientName);
最後一步在中介軟體中加上我們的Client檢視路由,這裡就不貼了,然後我們在WebTest服務中新增服務擴充套件
public void ConfigureServices(IServiceCollection services) { services.AddAdminChina(); }
這裡去掉上一篇中的根據引數判斷許可權的程式碼,實際操作不會這麼處理,畢竟其他的路由地址不會攜帶這個引數,以及在檢視中新增好我們的服務用與生成檢視類。還有就是中介軟體地址需要動態處理,這就不多說了,下面看下實際的效果,訪問我們的Client管理 列表頁面就出來了
好了,關於這塊的就說了,相信寫一個獨立的RPL包應該不是問題了