.NetCore 下開發獨立的(RPL)含有界面的組件包 (一)準備工做 javascript
.NetCore 下開發獨立的(RPL)含有界面的組件包 (二)擴展中間件及服 務html
.NetCore 下開發獨立的(RPL)含有界面的組件包 (三)構建界面 java
.NetCore 下開發獨立的(RPL)含有界面的組件包 (四)受權過濾 數據庫
.NetCore 下開發獨立的(RPL)含有界面的組件包 (五)受權過濾參數處 理安全
.NetCore 下開發獨立的(RPL)含有界面的組件包 (六)實現業務功能 ui
這裏們來作一個簡單的業務列表功能,這裏我就先來作一個Cient列表this
一如以往,先添加頁面spa
固然須要在界面上寫上咱們的列表語法,razorview會處理@符號的後臺代碼,這裏咱們制定了咱們的數據源是dataSoure,固然這裏是會報錯的,可是不要緊,由於最後執行都是ClientsIndex.Designer.cs類code
@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 生成下視圖orm
能夠看到生成是視圖代碼,淡然這裏的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包應該不是問題了