Fork me on GitHub

.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">&#xe605;</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\">&#xe605;</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\">&#xe605;</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包应该不是问题了

 

posted @ 2018-12-29 15:15  龙码精神  阅读(589)  评论(3编辑  收藏  举报