程序員得學會自我解放,YbSoftwareFactory就是這樣一款解放程序員的利器,能讓你更加專注於具體業務邏輯的實現,把自己從每日盲目的重復工作中解脫出來。能更有思想、更充分、更游刃有余地看待具體問題,而不僅僅是做一名水平低下的編碼員。本章節開始將以一個Demo來重點介紹YbSoftwareFactory代碼生成插件二次開發所需各個類的實現。 本章節將首先來看看“IPlugInGroupRepository”插件組接口的實現。
開始之前,說說插件加載的原理吧。YbSoftwareFactory使用了MEF來實現插件的加載,這是插件工作原理的關鍵,因此,實現的各個類必須遵循MEF的契約規范,重點是要在具體的實現類上聲明[Exprot]特性與Metadata。
1、“IPlugInGroupRepository”接口的實現,該接口的實現類用於加載本組插件中的各個子插件。插件組將在YbSoftwareFactory左邊的導航欄出現。
2、CastleDxWebPlugInGroupRepository源碼

using System.Collections.Generic;
using System.ComponentModel.Composition;
using System.Data;
using System.Linq;
using Yb.PlugIn.Base;
using Yb.Utility;
namespace Yb.PlugIn.CastleDevExpress.WebForm{
[PlugInGroupAttribute(
Name = " Castle DxV2 for WebForm ",
Description = " 生成 Castle 數據訪問層,DxV2 界面層代碼及解決方案 ",
DisplayOrder = 3,
DataSourceType = DataSourceType.Database,
DataSourceProviderString=DataSourceProviderString.SqlDataSource,
ImageUri = " pack://application:,,,/Yb.PlugIn.CastleDevExpress.WebForm;component/Images/WebFormSolution.png ",
LargeImageUri = " pack://application:,,,/Yb.PlugIn.CastleDevExpress.WebForm;component/Images/WebFormSolution.png ",
NavigationGroup = " Castle DxV2 代碼生成插件 ")]
[Export( typeof(IPlugInGroupRepository))]
public class CastleDxWebPlugInGroupRepository : IPlugInGroupRepository, IPartImportsSatisfiedNotification
{
[ImportMany(StaticResources.PlugInGroupKey,AllowRecomposition = true)]
public IEnumerable<Lazy<IPlugInRepository, IPlugInMetadata>> LazyPlugInRepositories { get; set; }
public void OnImportsSatisfied()
{
}
/// <summary>
/// 創建數據源
/// </summary> <param name="arg"></param>
/// <returns></returns>
public object CreateDataSource( object arg)
{
if(arg == null || string.IsNullOrWhiteSpace(arg.ToString()))
throw new ArgumentNullException( " arg ", " 參數不能為空 ");
var connectionString = arg.ToString();
var smo= new SmoUtility(connectionString);
// 獲取表信息
try
{
var tableInfos = smo.GetTableInfos();
// 過濾掉和權限有關的表
if (tableInfos != null && tableInfos.Count > 0)
tableInfos = tableInfos.Where(c => !StaticResources.SecurityDbTablesName.Contains(c.Name)).ToList();
return tableInfos;
}
catch (Exception er)
{
throw new DataException( " 獲取表信息失敗 ",er);
}
}
/// <summary>
/// 初始化模板
/// </summary>
/// <returns></returns>
public IEnumerable<TemplateInfo> GetTemplateInfos()
{
return StaticResources.GetTemplateInfos();
}
}
}
3、重點元數據聲明說明:
Name:將在YbSoftwareFactory軟件的NavigationControl中顯示的名稱。
DataSourceType:要生成代碼的數據源類型,當前僅僅支持數據源為數據庫,未來支持Asssembly和XML等,因此此處聲明為:DataSourceType.Database。
DataSourceProviderString:插件數據源所支持的數據庫類型,此處為SQL Server,如你的代碼生成插件可支持多種數據庫則可以在此處使用“|”分割(當前版本僅支持SQL Server)。
ImageUri和LargeImageUri:WPF格式的資源URI聲明,主要是在“Name”上顯示個性化圖標,注意在圖片對應的“屬性”窗口的把生成操作設置為“Resource”。
NavigationGroup:控制該插件組在界面NavigationControl控件的哪一個Group組中顯示。
4、實現“LazyPlugInRepositories”屬性,這個屬性最關鍵的是特性聲明,為避免加載其他人開發的插件,這里使用了如下聲明:
[ImportMany(StaticResources.PlugInGroupKey,AllowRecomposition = true)]
其中“StaticResources.PlugInGroupKey”就是來控制要加載的插件的范圍的,聲明如下:
public const string PlugInGroupKey = "Yb.PlugIn.CastleDevExpress.WebForm";
為避免和其他插件沖突,這里定義成了"Yb.PlugIn.CastleDevExpress.WebForm",一看就知道這是本項目的命名空間,建議通過這種方式來保證惟一性。
5、CreateDataSource方法
主要是生成在界面上要顯示的表信息和字段信息,傳入的arg參數是一個連接字符串信息,你可使用封裝好的“SmoUtility”類快速、方便地生成數據庫下的表信息。本Demo還對將在界面上顯示的表進行了過濾,主要是對一些和權限控制有關的表進行過濾,禁止其在界面上顯示。這些表將在該組的子插件下進行處理,最后使用SQL腳本統一安裝。如你沒有這方面的需求,你完全可以不用理會上面對數據庫表進行過濾的代碼。
6、最后是“GetTemplateInfos”方法
該方法主要是獲取當前插件組的模板信息,用於進行模板管理,你可以自由的實現,本Demo首先判斷有保存的模板的記錄沒有,沒有則加載默認模板並保存,當前實現的核心代碼如下:

/// 初始化模板
/// </summary>
/// <returns></returns>
public static IEnumerable<TemplateInfo> GetTemplateInfos()
{
var dbHelper = new YbSqliteHelper();
// 加載保存到數據庫中的模板
var result = dbHelper.FindTemplateInfosBy(StaticResources.PlugInGroupKey);
if (result == null || result.Count == 0)
{
// 數據庫中不包含該插件組的任何模板信息,則保存到數據庫
return InstallTemplates(dbHelper);
}
return result;
}
/// <summary>
/// 保存模板到數據庫
/// </summary>
/// <param name="dbHelper"></param>
/// <returns></returns>
private static IEnumerable<TemplateInfo> InstallTemplates(YbSqliteHelper dbHelper)
{
var templateInfos = StaticResources.GetDefaultTemplateInfos().ToList();
foreach ( var item in templateInfos)
dbHelper.InsertTemplateInfo(item);
return templateInfos;
} /// <summary>
/// 默認模板信息
/// </summary>
/// <returns></returns>
public static IEnumerable<TemplateInfo> GetDefaultTemplateInfos()
{
var templateInfos = new List<TemplateInfo>
{
new TemplateInfo()
{
Name = " 實體對象模板 ",
TemplateRelativePath = @" Templates\CastleActiveRecord\Entity\User.tt ",
Description = " 實體對象模板 ",
DisplayOrder = 5,
Encoding = Encoding.Default,
ExportFileNameFormatString = " %s.cs ",
ExportRelativePathFormatString =
@" YbRapidSolution\YbRapidSolution.Entities\%s ",
SyntaxHighlightingName = SyntaxHighlighting.CSharp,
BuildEnable = true,
PlugInGroupKey = StaticResources.PlugInGroupKey,
Tag = EntitiesPlugInTemplateTag|SolutionPlugInTemplateTag
},
new TemplateInfo()
{
Name = " 實體對象后置代碼模板 ",
TemplateRelativePath =
@" Templates\CastleActiveRecord\Entity\AutoGenerated.tt ",
Description = " 實體對象后置代碼模板 ",
DisplayOrder = 10,
Encoding = Encoding.Default,
ExportFileNameFormatString = " %s.AutoGenerated.cs ",
ExportRelativePathFormatString =
@" YbRapidSolution\YbRapidSolution.Entities\%s ",
SyntaxHighlightingName = SyntaxHighlighting.CSharp,
BuildEnable = true,
PlugInGroupKey = StaticResources.PlugInGroupKey,
Tag = EntitiesPlugInTemplateTag|SolutionPlugInTemplateTag
},
new TemplateInfo()
{
Name = " 實體項目模板 ",
TemplateRelativePath =
@" Templates\CastleActiveRecord\Entity\ProjectInfo.tt ",
Description = " 實體項目模板 ",
DisplayOrder = 15,
Encoding = Encoding.Default,
ExportFileNameFormatString = " YbRapidSolution.Entities.csproj ",
ExportRelativePathFormatString =
@" YbRapidSolution\YbRapidSolution.Entities\%s ",
SyntaxHighlightingName = SyntaxHighlighting.CSharp,
BuildEnable = true,
PlugInGroupKey = StaticResources.PlugInGroupKey,
Tag = SolutionPlugInTemplateTag|IsTableInfoListOfTemplateArg
},
new TemplateInfo()
{
Name = " 對象頁面文件 ",
TemplateRelativePath = @" Templates\CastleActiveRecord\WebForm\aspx.tt ",
Description = " 對象頁面文件 ",
DisplayOrder = 50,
ExportFileNameFormatString = " %sadmin.aspx ",
ExportRelativePathFormatString =
@" YbRapidSolution\YbRapidSolution.WebForms\Admin\%s ",
Encoding = Encoding.UTF8,
SyntaxHighlightingName = SyntaxHighlighting.ASPX,
BuildEnable = true,
PlugInGroupKey = StaticResources.PlugInGroupKey,
Tag = UIPlugInTemplateTag|SolutionPlugInTemplateTag
},
new TemplateInfo()
{
Name = " 對象頁面后置文件 ",
TemplateRelativePath =
@" Templates\CastleActiveRecord\WebForm\aspx.cs.tt ",
Description = " 對象頁面后置文件 ",
DisplayOrder = 55,
ExportFileNameFormatString = " %sadmin.aspx.cs ",
ExportRelativePathFormatString =
@" YbRapidSolution\YbRapidSolution.WebForms\Admin\%s ",
Encoding = Encoding.UTF8,
SyntaxHighlightingName = SyntaxHighlighting.CSharp,
BuildEnable = true,
PlugInGroupKey = StaticResources.PlugInGroupKey,
Tag = UIPlugInTemplateTag|SolutionPlugInTemplateTag
},
new TemplateInfo()
{
Name = " 對象頁面設計時后置文件 ",
TemplateRelativePath =
@" Templates\CastleActiveRecord\WebForm\aspx.designer.cs.tt ",
Description = " 對象頁面設計時后置文件 ",
DisplayOrder = 65,
ExportFileNameFormatString = " %sadmin.aspx.designer.cs ",
ExportRelativePathFormatString =
@" YbRapidSolution\YbRapidSolution.WebForms\Admin\%s ",
Encoding = Encoding.Default,
SyntaxHighlightingName = SyntaxHighlighting.CSharp,
BuildEnable = true,
PlugInGroupKey = StaticResources.PlugInGroupKey,
Tag = UIPlugInTemplateTag|SolutionPlugInTemplateTag
},
new TemplateInfo()
{
Name = " 對象頁面后台起始頁 ",
TemplateRelativePath =
@" Templates\CastleActiveRecord\WebForm\Default.aspx.tt ",
Description = " 對象頁面后台起始頁 ",
DisplayOrder = 70,
ExportFileNameFormatString = " Default.aspx ",
ExportRelativePathFormatString =
@" YbRapidSolution\YbRapidSolution.WebForms\Admin\Default.aspx ",
Encoding = Encoding.UTF8,
SyntaxHighlightingName = SyntaxHighlighting.ASPX,
BuildEnable = true,
PlugInGroupKey = StaticResources.PlugInGroupKey,
Tag = SolutionPlugInTemplateTag|IsTableInfoListOfTemplateArg
},
new TemplateInfo()
{
Name = " ASP.NET Global 后置代碼文件 ",
TemplateRelativePath =
@" Templates\CastleActiveRecord\WebForm\Global.asax.cs.tt ",
Description = " SP.NET Global 后置代碼文件 ",
DisplayOrder = 70,
EncodingName = " Default ",
ExportFileNameFormatString = " Global.asax.cs ",
ExportRelativePathFormatString =
@" YbRapidSolution\YbRapidSolution.WebForms\Global.asax.cs ",
Encoding = Encoding.Default,
SyntaxHighlightingName = SyntaxHighlighting.CSharp,
BuildEnable = true,
PlugInGroupKey = StaticResources.PlugInGroupKey,
Tag = SolutionPlugInTemplateTag|IsTableInfoListOfTemplateArg
},
new TemplateInfo()
{
Name = " WebForm 項目文件 ",
TemplateRelativePath =
@" Templates\CastleActiveRecord\WebForm\ProjectInfo.tt ",
Description = " WebForm 項目文件 ",
DisplayOrder = 75,
ExportFileNameFormatString = " YbRapidSolution.WebForms.csproj ",
ExportRelativePathFormatString =
@" YbRapidSolution\YbRapidSolution.WebForms\%s ",
Encoding = Encoding.UTF8,
SyntaxHighlightingName = SyntaxHighlighting.CSharp,
BuildEnable = true,
PlugInGroupKey = StaticResources.PlugInGroupKey,
Tag = SolutionPlugInTemplateTag|IsTableInfoListOfTemplateArg
},
new TemplateInfo()
{
Name = " Web.config 文件 ",
TemplateRelativePath =
@" Templates\CastleActiveRecord\WebForm\Web.config.tt ",
Description = " Web.config 文件 ",
DisplayOrder = 80,
ExportFileNameFormatString = " Web.config ",
ExportRelativePathFormatString =
@" YbRapidSolution\YbRapidSolution.WebForms\Web.config ",
Encoding = Encoding.UTF8,
SyntaxHighlightingName = SyntaxHighlighting.XML,
BuildEnable = true,
PlugInGroupKey = StaticResources.PlugInGroupKey,
Tag = SolutionPlugInTemplateTag|IsTableInfoListOfTemplateArg
},
new TemplateInfo()
{
Name = " 權限數據庫表初始化腳本文件 ",
TemplateRelativePath = @" Templates\ProviderInstallScript.sql ",
Description = " 權限數據庫表初始化腳本文件 ",
DisplayOrder = 100,
ExportFileNameFormatString = @" ProviderInstallScript.sql ",
ExportRelativePathFormatString =
@" YbRapidSolution\YbRapidSolution.WebForms\Web.config ",
Encoding = Encoding.Default,
SyntaxHighlightingName = SyntaxHighlighting.XML,
BuildEnable = false,
PlugInGroupKey = StaticResources.PlugInGroupKey
}
};
return templateInfos;
}
一個插件組的代碼就完成了,下一章節將開始介紹各個子插件的Demo實現。
有興趣的朋友可以下載本插件Demo源代碼和YbSoftwareFactory應用程序(本站上傳文件大小受限,只有臨時找個網盤,有需要的可以加QQ)。
“Yb.PlugIn.CastleDevExpress.WebForm”插件源碼下載
附“Yb.PlugIn.CastleDevExpress.WebForm”代碼生成插件的Demo數據庫下載