直接使用简单粗暴的手法修改T4模板
达到以下结果:
首先,找到EF映射之后的edmx文件下的t4文件
内容如下:
把该文件中的内容作为原型进行修改!
新建项目选择文本模板就行了,然后把它清空。
由于文件太长,就不展示了,只展示修改地方。
一、生成多个类文件
直接放改动之后的代码!
前半截:
<#@ template language="C#" debug="false" hostspecific="true"#>
<#@ include file="EF6.Utility.CS.ttinclude"#><#@
output extension=".cs"#><#
//修改const string inputFile = @"NoteModel.edmx"; 为下方代码
string inputFile =Host.ResolveAssemblyReference("$(ProjectDir)").Replace("FFeat.Note.IDal","FFeat.Note.Model")+"/NoteModel.edmx";
var textTransform = DynamicTextTransformation.Create(this);
var code = new CodeGenerationTools(this);
var ef = new MetadataTools(this);
var typeMapper = new TypeMapper(code, ef, textTransform.Errors);
var fileManager = EntityFrameworkTemplateFileManager.Create(this);
var itemCollection = new EdmMetadataLoader(textTransform.Host, textTransform.Errors).CreateEdmItemCollection(inputFile);
var codeStringGenerator = new CodeStringGenerator(code, typeMapper, ef);
if (!typeMapper.VerifyCaseInsensitiveTypeUniqueness(typeMapper.GetAllGlobalItems(itemCollection), inputFile))
{
return string.Empty;
}
WriteHeader(codeStringGenerator, fileManager);
foreach (var entity in typeMapper.GetItemsToGenerate<EntityType>(itemCollection))
{
fileManager.StartNewFile("I"+entity.Name + "IDal_1.cs");//改处2 防止自动合并原有类文件
//BeginNamespace(code); 命名空间语句头,强迫症,挪到了using语句下方
#>
//手动添加需要的命名空间
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using FFeat.Note.Model;
<#=codeStringGenerator.UsingDirectives(inHeader: false)#>
<# BeginNamespace(code);#>//上面挪过来的
<#=codeStringGenerator.EntityClassOpening(entity)#>
{
//删除了原型模板里的代码,删到命名空间结束之前的}符号为止。
}
<#
EndNamespace(code);
}
第二部分:
修改方法:
public string EntityClassOpening(EntityType entity)
{
return string.Format(
CultureInfo.InvariantCulture,
"{0} {1}partial interface I{2}Dal{3}:IBaseDal<"+entity.Name+""+">",//类名更改处,这里加上了统一继承
Accessibility.ForType(entity),
_code.SpaceAfter(_code.AbstractOption(entity)),
_code.Escape(entity),
_code.StringBefore(" : ", _typeMapper.GetTypeName(entity.BaseType)));
}
改之前是:
public string EntityClassOpening(EntityType entity)
{
return string.Format(
CultureInfo.InvariantCulture,
"{0} {1}partial interface {2}{3}",
Accessibility.ForType(entity),
_code.SpaceAfter(_code.AbstractOption(entity)),
_code.Escape(entity),
_code.StringBefore(" : ", _typeMapper.GetTypeName(entity.BaseType)));
}
上面更改后,可达到以下效果图:
二、如果是单文件
先上效果图:
代码修改如下:
<#@ template language="C#" debug="false" hostspecific="true"#>
<#@ include file="EF6.Utility.CS.ttinclude"#><#@
output extension=".cs"#>
<#
//这里依旧要改
string inputFile = Host.ResolveAssemblyReference("$(ProjectDir)").Replace("FFeat.Note.Factory","FFeat.Note.Model")+"/NoteModel.edmx";
var textTransform = DynamicTextTransformation.Create(this);
var code = new CodeGenerationTools(this);
var ef = new MetadataTools(this);
var typeMapper = new TypeMapper(code, ef, textTransform.Errors);
var fileManager = EntityFrameworkTemplateFileManager.Create(this);
var itemCollection = new EdmMetadataLoader(textTransform.Host, textTransform.Errors).CreateEdmItemCollection(inputFile);
var codeStringGenerator = new CodeStringGenerator(code, typeMapper, ef);
if (!typeMapper.VerifyCaseInsensitiveTypeUniqueness(typeMapper.GetAllGlobalItems(itemCollection), inputFile))
{
return string.Empty;
}
WriteHeader(codeStringGenerator, fileManager);
//foreach (var entity in typeMapper.GetItemsToGenerate<EntityType>(itemCollection)) 这个方法挪到下方,用来生成有类名的语句块
//{
// fileManager.StartNewFile(entity.Name + ".cs");
// BeginNamespace(code);
#>
//手动添加的using块
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using FFeat.Note.IDal;
<#=codeStringGenerator.UsingDirectives(inHeader: false)#>
<#BeginNamespace(code);#>
//<#=codeStringGenerator.EntityClassOpening(entity)#> 换成下方固定的
public partial class StaticDalFactory
{
public static string AssemblyName = System.Configuration.ConfigurationManager.AppSettings["DALAssemblyName"];
<#foreach(var entity in typeMapper.GetItemsToGenerate<EntityType>(itemCollection))//利用entity.Name 获得所有类名
{#>
public static I<#=entity.Name#>Dal Get<#=entity.Name#>Dal()=> Assembly.Load(AssemblyName).CreateInstance(AssemblyName + ".<#=entity.Name#>Dal") as I<#=entity.Name#>Dal;
<#}#>
}
<#
EndNamespace(code);
原理都挺简单的,相信大家看两眼就能看懂,这里只做一个抛砖引玉,我就不献丑了。
总的来说,改的地方也不多。三层架构中,把需要重复的动作都放一个T4模板进去。
以后需要增加model的话,也只需要菜单>生成>转换所有T4模板,就一步到位啦!