using NCC.Dependency; using NCC.Extensions; using NCC.Reflection; using System; using System.IO; using System.Threading.Tasks; namespace NCC.ViewEngine { /// /// 视图引擎模板(编译后) /// [SuppressSniffer] public class ViewEngineTemplate : IViewEngineTemplate { /// /// 内存流 /// private readonly MemoryStream assemblyByteCode; /// /// 模板类型 /// private readonly Type templateType; /// /// 构造函数 /// /// internal ViewEngineTemplate(MemoryStream assemblyByteCode) { this.assemblyByteCode = assemblyByteCode; templateType = Reflect.GetType(assemblyByteCode, "NCC.ViewEngine.Template"); } /// /// 保存到流中 /// /// public void SaveToStream(Stream stream) { SaveToStreamAsync(stream).GetAwaiter().GetResult(); } /// /// 保存到流中 /// /// /// public Task SaveToStreamAsync(Stream stream) { return assemblyByteCode.CopyToAsync(stream); } /// /// 保存到文件 /// /// public void SaveToFile(string fileName) { SaveToFileAsync(fileName).GetAwaiter().GetResult(); } /// /// 保存到文件 /// /// /// public async Task SaveToFileAsync(string fileName) { using var fileStream = new FileStream( path: Penetrates.GetTemplateFileName(fileName), mode: FileMode.OpenOrCreate, access: FileAccess.Write, share: FileShare.None, bufferSize: 8192, useAsync: true); await assemblyByteCode.CopyToAsync(fileStream); } /// /// 执行编译 /// /// /// public string Run(object model = null) { return RunAsync(model).GetAwaiter().GetResult(); } /// /// 执行编译 /// /// /// public async Task RunAsync(object model = null) { if (model != null && model.IsAnonymous()) { model = new AnonymousTypeWrapper(model); } var instance = (IViewEngineModel)Activator.CreateInstance(templateType); instance.Model = model; await instance.ExecuteAsync(); return await instance.ResultAsync(); } /// /// 从文件中加载模板 /// /// /// public static IViewEngineTemplate LoadFromFile(string fileName) { return LoadFromFileAsync(fileName: fileName).GetAwaiter().GetResult(); } /// /// 从文件中加载模板 /// /// /// public static async Task LoadFromFileAsync(string fileName) { using var memoryStream = new MemoryStream(); using (var fileStream = new FileStream( path: Penetrates.GetTemplateFileName(fileName), mode: FileMode.Open, access: FileAccess.Read, share: FileShare.None, bufferSize: 8192, useAsync: true)) { await fileStream.CopyToAsync(memoryStream); } return new ViewEngineTemplate(memoryStream); } /// /// 从流中加载模板 /// /// /// public static IViewEngineTemplate LoadFromStream(Stream stream) { return LoadFromStreamAsync(stream).GetAwaiter().GetResult(); } /// /// 从流中加载模板 /// /// /// public static async Task LoadFromStreamAsync(Stream stream) { var memoryStream = new MemoryStream(); await stream.CopyToAsync(memoryStream); memoryStream.Position = 0; return new ViewEngineTemplate(memoryStream); } } /// /// 视图引擎模板(编译后) /// /// [SuppressSniffer] public class ViewEngineTemplate : IViewEngineTemplate where T : IViewEngineModel { /// /// 内存流 /// private readonly MemoryStream assemblyByteCode; /// /// 内存流 /// private readonly Type templateType; /// /// 构造函数 /// /// internal ViewEngineTemplate(MemoryStream assemblyByteCode) { this.assemblyByteCode = assemblyByteCode; templateType = Reflect.GetType(assemblyByteCode, "NCC.ViewEngine.Template"); } /// /// 保存到流中 /// /// public void SaveToStream(Stream stream) { SaveToStreamAsync(stream).GetAwaiter().GetResult(); } /// /// 保存到流中 /// /// /// public Task SaveToStreamAsync(Stream stream) { return assemblyByteCode.CopyToAsync(stream); } /// /// 保存到文件中 /// /// public void SaveToFile(string fileName) { SaveToFileAsync(fileName).GetAwaiter().GetResult(); } /// /// 保存到文件中 /// /// /// public async Task SaveToFileAsync(string fileName) { using var fileStream = new FileStream( path: Penetrates.GetTemplateFileName(fileName), mode: FileMode.OpenOrCreate, access: FileAccess.Write, share: FileShare.None, bufferSize: 8192, useAsync: true); await assemblyByteCode.CopyToAsync(fileStream); } /// /// 执行编译 /// /// /// public string Run(Action initializer) { return RunAsync(initializer).GetAwaiter().GetResult(); } /// /// 执行编译 /// /// /// public async Task RunAsync(Action initializer) { var instance = (T)Activator.CreateInstance(templateType); initializer(instance); await instance.ExecuteAsync(); return await instance.ResultAsync(); } /// /// 从文件中加载模板 /// /// /// public static IViewEngineTemplate LoadFromFile(string fileName) { return LoadFromFileAsync(fileName: fileName).GetAwaiter().GetResult(); } /// /// 从文件中加载模板 /// /// /// public static async Task> LoadFromFileAsync(string fileName) { using var memoryStream = new MemoryStream(); using (var fileStream = new FileStream( path: Penetrates.GetTemplateFileName(fileName), mode: FileMode.Open, access: FileAccess.Read, share: FileShare.None, bufferSize: 8192, useAsync: true)) { await fileStream.CopyToAsync(memoryStream); } return new ViewEngineTemplate(memoryStream); } /// /// 从流中加载模板 /// /// /// public static IViewEngineTemplate LoadFromStream(Stream stream) { return LoadFromStreamAsync(stream).GetAwaiter().GetResult(); } /// /// 从流中加载模板 /// /// /// public static async Task> LoadFromStreamAsync(Stream stream) { var memoryStream = new MemoryStream(); await stream.CopyToAsync(memoryStream); memoryStream.Position = 0; return new ViewEngineTemplate(memoryStream); } } }