Skip to content

Commit 5f00a46

Browse files
committed
代码生成器迁移到.netcore
1 parent e840f59 commit 5f00a46

File tree

6 files changed

+69
-104
lines changed

6 files changed

+69
-104
lines changed

WebApiClientCore.OpenApi.SourceGenerator/CSharpHtml.cs

Lines changed: 22 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
using RazorEngine.Configuration;
2-
using RazorEngine.Templating;
1+
using RazorEngineCore;
32
using System;
3+
using System.Collections.Concurrent;
44
using System.Collections.Generic;
55
using System.Diagnostics;
66
using System.IO;
@@ -47,28 +47,19 @@ public static CSharpHtml<T> Views<T>(string name)
4747
/// <summary>
4848
/// 表示视图模板
4949
/// </summary>
50-
[DebuggerDisplay("{TemplateFile}")]
51-
class CSharpHtml<T> : ITemplateSource
50+
[DebuggerDisplay("{FilePath}")]
51+
class CSharpHtml<T>
5252
{
53-
/// <summary>
54-
/// 模板内容
55-
/// </summary>
56-
private readonly Lazy<string> template;
57-
58-
/// <summary>
59-
/// 获取模板内容
60-
/// </summary>
61-
public string Template => this.template.Value;
62-
6353
/// <summary>
6454
/// 获取模板文件路径
6555
/// </summary>
66-
public string TemplateFile { get; private set; }
56+
public string FilePath { get; }
6757

6858
/// <summary>
6959
/// 块元素
7060
/// </summary>
71-
public HashSet<string> BlockElements { get; private set; }
61+
public HashSet<string> BlockElements { get; }
62+
7263

7364
/// <summary>
7465
/// 视图模板
@@ -93,34 +84,10 @@ public CSharpHtml(string path)
9384
throw new FileNotFoundException(path);
9485
}
9586

96-
this.template = new Lazy<string>(this.ReadTemplate);
97-
this.TemplateFile = Path.GetFullPath(path);
87+
this.FilePath = Path.GetFullPath(path);
9888
this.BlockElements = new HashSet<string>(new[] { "p", "div" }, StringComparer.OrdinalIgnoreCase);
9989
}
10090

101-
/// <summary>
102-
/// 读取模板资源
103-
/// </summary>
104-
/// <returns></returns>
105-
private string ReadTemplate()
106-
{
107-
using (var stream = new FileStream(this.TemplateFile, FileMode.Open))
108-
{
109-
using (var reader = new StreamReader(stream))
110-
{
111-
return reader.ReadToEnd();
112-
}
113-
}
114-
}
115-
116-
/// <summary>
117-
/// 返回模板内容读取器
118-
/// </summary>
119-
/// <returns></returns>
120-
TextReader ITemplateSource.GetTemplateReader()
121-
{
122-
return new StringReader(this.Template);
123-
}
12491

12592
/// <summary>
12693
/// 返回视图Html
@@ -134,7 +101,9 @@ public string RenderHtml(T model)
134101
{
135102
throw new ArgumentNullException(nameof(model));
136103
}
137-
return Razor.RunCompile(this.TemplateFile, this, model);
104+
105+
var content = File.ReadAllText(this.FilePath);
106+
return Razor.Compile(content).Run(model);
138107
}
139108

140109
/// <summary>
@@ -204,57 +173,26 @@ private void RenderText(XElement element, StringBuilder builder)
204173
static class Razor
205174
{
206175
/// <summary>
207-
/// razor引擎
208-
/// </summary>
209-
private static readonly IRazorEngineService razor;
210-
211-
/// <summary>
212-
/// 同步锁
176+
/// 模板缓存
213177
/// </summary>
214-
private static readonly object syncRoot = new object();
215-
216-
/// <summary>
217-
/// 视图名称集合
218-
/// </summary>
219-
private static readonly HashSet<string> templateNames = new HashSet<string>();
220-
221-
/// <summary>
222-
/// 视图模板
223-
/// </summary>
224-
static Razor()
225-
{
226-
var config = new TemplateServiceConfiguration
227-
{
228-
Debug = true,
229-
CachingProvider = new DefaultCachingProvider(t => { })
230-
};
231-
razor = RazorEngineService.Create(config);
232-
}
178+
private static readonly ConcurrentDictionary<string, IRazorEngineCompiledTemplate> templateCache = new ConcurrentDictionary<string, IRazorEngineCompiledTemplate>();
233179

234180
/// <summary>
235181
/// 编译并执行
236182
/// </summary>
237-
/// <param name="name">模板名称</param>
238-
/// <param name="source">模板提供者</param>
239-
/// <param name="model">模型</param>
183+
/// <param name="content">模板名称</param>
240184
/// <returns></returns>
241-
public static string RunCompile(string name, ITemplateSource source, object model)
185+
public static IRazorEngineCompiledTemplate Compile(string content)
242186
{
243-
if (model == null)
187+
return templateCache.GetOrAdd(content, c => new RazorEngine().Compile(content, builder =>
244188
{
245-
throw new ArgumentNullException(nameof(model));
246-
}
247-
248-
lock (syncRoot)
249-
{
250-
if (templateNames.Add(name) == true)
251-
{
252-
razor.AddTemplate(name, source);
253-
razor.Compile(name);
254-
}
255-
}
189+
builder.Inherits(typeof(HtmlTempate));
190+
builder.AddAssemblyReference(typeof(NSwag.OpenApiSchema).Assembly);
191+
builder.AddAssemblyReference(typeof(NJsonSchema.JsonSchema).Assembly);
192+
builder.AddAssemblyReference(typeof(Newtonsoft.Json.Schema.JsonSchema).Assembly);
256193

257-
return razor.RunCompile(name, model.GetType(), model);
194+
builder.AddUsing("System");
195+
}));
258196
}
259197
}
260198
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
using RazorEngineCore;
2+
3+
namespace WebApiClientCore.OpenApi.SourceGenerator
4+
{
5+
/// <summary>
6+
/// html模板
7+
/// </summary>
8+
public class HtmlTempate : RazorEngineTemplateBase
9+
{
10+
/// <summary>
11+
/// html标签转换
12+
/// </summary>
13+
/// <param name="obj"></param>
14+
public override void Write(object obj = null)
15+
{
16+
var text = obj?.ToString();
17+
if (text != null)
18+
{
19+
text = text.Replace("<", "&lt;").Replace(">", "&gt;");
20+
}
21+
base.Write(text);
22+
}
23+
}
24+
25+
/// <summary>
26+
/// html模板
27+
/// </summary>
28+
/// <typeparam name="T"></typeparam>
29+
public class HtmlTempate<T> : HtmlTempate
30+
{
31+
public new T Model { get; set; }
32+
}
33+
}
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
{
22
"profiles": {
33
"WebApiClient.Tools.Swagger": {
4-
"commandName": "Project"
4+
"commandName": "Project",
5+
"commandLineArgs": "-o petstore.openApi.json"
56
}
67
}
78
}

WebApiClientCore.OpenApi.SourceGenerator/Views/HttpApi.cshtml

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,4 @@
1-
@inherits HtmlTemplateBase<HttpApi>
2-
3-
@using WebApiClientCore.OpenApi.SourceGenerator
4-
@using RazorEngine.Templating
5-
@using NSwag
1+
@inherits WebApiClientCore.OpenApi.SourceGenerator.HtmlTempate<WebApiClientCore.OpenApi.SourceGenerator.HttpApi>
62

73
<HttpApi>
84
<usings>
@@ -84,29 +80,29 @@
8480
<span>[Required]</span>
8581
}
8682

87-
if (parameter.VariableName != parameter.Name && parameter.Kind != OpenApiParameterKind.Header)
83+
if (parameter.VariableName != parameter.Name && parameter.Kind != NSwag.OpenApiParameterKind.Header)
8884
{
8985
<span>[AliasAs("@(parameter.Name)")]</span>
9086
}
9187

92-
if (parameter.Kind == OpenApiParameterKind.Path || parameter.Kind == OpenApiParameterKind.Query)
88+
if (parameter.Kind == NSwag.OpenApiParameterKind.Path || parameter.Kind == NSwag.OpenApiParameterKind.Query)
9389
{
9490
var schema = parameter.Schema as NSwag.OpenApiParameter;
95-
if (schema != null && schema.CollectionFormat != OpenApiParameterCollectionFormat.Undefined
96-
&& schema.CollectionFormat != OpenApiParameterCollectionFormat.Multi)
91+
if (schema != null && schema.CollectionFormat != NSwag.OpenApiParameterCollectionFormat.Undefined
92+
&& schema.CollectionFormat != NSwag.OpenApiParameterCollectionFormat.Multi)
9793
{
9894
<span>[PathQuery(CollectionFormat = CollectionFormat.@(schema.CollectionFormat))]</span>
9995
}
10096
}
101-
else if (parameter.Kind == OpenApiParameterKind.Header)
97+
else if (parameter.Kind == NSwag.OpenApiParameterKind.Header)
10298
{
10399
<span>[Header("@(parameter.Name)")]</span>
104100
}
105101
else if (parameter.IsXmlBodyParameter == true)
106102
{
107103
<span>[XmlContent]</span>
108104
}
109-
else if (parameter.Kind == OpenApiParameterKind.FormData)
105+
else if (parameter.Kind == NSwag.OpenApiParameterKind.FormData)
110106
{
111107
if (parameter.IsFile == false)
112108
{
@@ -120,7 +116,7 @@
120116
}
121117
}
122118
}
123-
else if (parameter.Kind == OpenApiParameterKind.Body)
119+
else if (parameter.Kind == NSwag.OpenApiParameterKind.Body)
124120
{
125121
if (parameter.IsBinaryBody == false)
126122
{

WebApiClientCore.OpenApi.SourceGenerator/Views/HttpModel.cshtml

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,9 @@
1-
@inherits HtmlTemplateBase<HttpModel>
2-
3-
@using WebApiClientCore.OpenApi.SourceGenerator
4-
@using RazorEngine.Templating
1+
@inherits WebApiClientCore.OpenApi.SourceGenerator.HtmlTempate<WebApiClientCore.OpenApi.SourceGenerator.HttpModel>
52

63
<HttpModel>
74
<usings>
85
<div>using System;</div>
9-
<div>using System.Collections.Generic;</div>
6+
<div>using System.Collections.Generic;</div>
107
<div>using System.Text.Json.Serialization;</div>
118
<div>using System.Runtime.Serialization;</div>
129
<div>using System.Collections.ObjectModel;</div>

WebApiClientCore.OpenApi.SourceGenerator/WebApiClientCore.OpenApi.SourceGenerator.csproj

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<PropertyGroup>
44
<OutputType>Exe</OutputType>
5-
<TargetFramework>net451</TargetFramework>
5+
<TargetFramework>netcoreapp3.1</TargetFramework>
66
<Authors>laojiu</Authors>
77
<Company>laojiu</Company>
88
<Copyright>Copyright © laojiu 2017-2020</Copyright>
@@ -13,7 +13,7 @@
1313

1414
<ItemGroup>
1515
<PackageReference Include="CommandLineParser" Version="1.9.71" />
16-
<PackageReference Include="RazorEngine" Version="3.10.0" />
16+
<PackageReference Include="RazorEngineCore" Version="2020.6.1" />
1717
<PackageReference Include="NSwag.CodeGeneration.CSharp" Version="13.5.0" />
1818
</ItemGroup>
1919

0 commit comments

Comments
 (0)