CodeFactory提供了文件生成向导功能,虽然插件提供了一些生成向导,但远远满足不了实际的需要;所以插件提供扩展功能方便用户扩展自己的生成文件功能。下面通过讲解插件提供的生成向导来了解一下CodeFactory如何扩展自己的文件生成方式。由于插件是集成NVelocity所以插件会提供一些抽象类来支持基于NVelocity模板生成文件的扩展;虽然是这样但用户通过以下讲解可以了解到完全扩展出使用其他的模板引擎来生成文件。
文件扩展接口
public interface IFileAddin
{
void Execute(object winObj, Solution solution, SelectedItems items);
}
这个接口比较抽象如果对DTE不了解的朋友估计很难入手,往下走问题会慢慢简单起来。
插件提供了这个接口实现的抽象类用来简化二次扩展的。
public abstract class FileAddinBase : IFileAddin
{
public UIHierarchy Hierarchy
{
get;
}
public Solution Solution
{
get;
}
public Project Project
{
get;
}
public ProjectItem ProjectItem
{
get;
}
public string FilePath
{
get
}
public void Execute(object winObj,Solution solution ,SelectedItems items);
protected abstract IList<string> OnExecute();
//只支持NVelocity的解决输出
protected void WriteFile(string filename,Dictionary<string,object> parameters,TemplateBase template);
}
直接下来看一下插件是如何通过这个抽象类来实现提供的生成向导的。
public abstract class TableFileBase:CodeFactoryAddin.Base.FileAddinBase
{
protected override IList<string> OnExecute()
{
List<string> filenames = new List<string>();
Information frm = new Information();
if (frm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
List<CodeFactoryAddin.Base.Databases.Table> tables = frm.SelectTables;
List<CodeFactoryAddin.Base.CustomObject> customs = frm.Customs;
string filename;
Dictionary<string, object> paramters;
foreach (CodeFactoryAddin.Base.Databases.Table item in tables)
{
paramters = new Dictionary<string, object>();
paramters.Add("table", item);
foreach (CodeFactoryAddin.Base.CustomObject co in customs)
{
paramters.Add(co.Name, co.Value);
}
filename = this.FilePath + item.Name + FileType;
this.WriteFile(filename, paramters,Template);
filenames.Add(filename);
}
}
return filenames;
}
public abstract string FileType
{
get;
}
public abstract TemplateBase Template
{
get;
}
}
相信看了这里应该非常明白了,其实就是继承FileAddinBase重写OnExecute方法,并返回创建了文件的文件路径表表.
[CodeFactoryAddin.Base.FileAddin("普通实体模型生成...",".cs")]
public class Default:CodeFactoryAddin.Base.Extends.TableFileBase
{
#region IFileAddin 成员
public override CodeFactoryAddin.Base.TemplateBase Template
{
get { return
new FileFolder("Entity(CSharp).vm");
}
}
public override string FileType
{
get
{
return ".cs";
}
}
#endregion
}
[CodeFactoryAddin.Base.FileAddin("NClay实体模型生成...",".cs")]
public class NClayModel : Default
{
public override CodeFactoryAddin.Base.TemplateBase Template
{
get
{
return new FileFolder("nclay_model.vm");
}
}
}
[CodeFactoryAddin.Base.FileAddin("ActiveRecord实体模型生成...", ".cs")]
public class ActiveRecord : Default
{
public override CodeFactoryAddin.Base.TemplateBase Template
{
get
{
return new FileFolder("ActiveRecord(CSharp).vm");
}
}
}
这样文件生成扩展就完成了,但还有一个地方要注意的就是
[CodeFactoryAddin.Base.FileAddin("普通实体模型生成...",".cs")]
描述该向导的名称和相关文件类型,如果不加上这些attribute那插件无法识别。
最后就是把DLL放到插件目录下即可。
当然在开发的文件生成向导里要引用以下程序集:
CodeFactoryAddin.Base
EnvDTE80
EnvDTE
Extensibility