liukuo362573 / YiShaAdmin

基于 .NET Core MVC 的权限管理系统,代码易读易懂、界面简洁美观
MIT License
2.45k stars 884 forks source link

建议:将代码生成改为使用Razer机制 #102

Open jxzly229190 opened 3 years ago

jxzly229190 commented 3 years ago

我认为,如果将现有代码生成改为利用Razer机制,是比直接拼接字符串更好的选择。理由如下:

  1. 代码可读性更好;
  2. 使用基于CSHTML模板文件生成,后续的维护性和拓展性也更方便;
  3. 基于模板,开发效率更高;

基于此,我做了些简单的尝试。

模板文件(Entity.cshtml):

namespace YiSha.Entity.@Html.Raw(Model.Package)
{
    /// <summary>
    /// 创 建:
    /// 日 期:
    /// 描 述:@Html.Raw(Model.FName)实体类
    /// </summary>
    [Table("@Html.Raw(Model.CName)")]
    public class @Html.Raw(Model.CName)Entity : BaseExtensionEntity
    {
    @foreach (var item in Model.Columns)
    {
        @:/// <summary>
        @:/// @Html.Raw(item.Name)
        @:/// </summary>
        @:public @Html.Raw(item.Datatype) @Html.Raw(item.TableColumn) { get; set; }
    }
    }
}

核心代码如下:

private async Task<string> GenerateCode(string viewName, string codePath, TableInfoDto table)
{
    var html = await this.RenderViewAsync(viewName, table, true);
    if (!System.IO.File.Exists(codePath))
    {
        FileHelper.CreateFile(codePath, html);
    }
    return html;
}
 public async Task<string> RenderViewAsync<TModel>(string viewName, TModel model, bool partial = false)
  {
      if (string.IsNullOrEmpty(viewName))
      {
          viewName = ControllerContext.ActionDescriptor.ActionName;
      }
      ViewData.Model = model;
      using (var writer = new StringWriter())
      {
          IViewEngine viewEngine = HttpContext.RequestServices.GetService(typeof(ICompositeViewEngine)) as ICompositeViewEngine;
          ViewEngineResult viewResult = viewEngine.FindView(ControllerContext, viewName, !partial);
          if (viewResult.Success == false)
          {
              return $"A view with the name {viewName} could not be found";
          }
          ViewContext viewContext = new ViewContext(
              ControllerContext,
              viewResult.View,
              ViewData,
              TempData,
              writer,
              new HtmlHelperOptions()
          );
          await viewResult.View.RenderAsync(viewContext);
          return writer.GetStringBuilder().ToString();
      }
  }
jxzly229190 commented 3 years ago

若有兴趣,请加我微信(jxzly229190),进一步讨论。

liukuo362573 commented 3 years ago

使用Razor可能会好,使用字符串拼接方式的好处是没有任何依赖,你有兴趣,可以自己研究。