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);
}
}
}