YbSoftwareFactory 代碼生成插件【二】:二次開發之 IPlugInGroupRepository 接口的實現


    程序員得學會自我解放,YbSoftwareFactory就是這樣一款解放程序員的利器,能讓你更加專注於具體業務邏輯的實現,把自己從每日盲目的重復工作中解脫出來。能更有思想、更充分、更游刃有余地看待具體問題,而不僅僅是做一名水平低下的編碼員。本章節開始將以一個Demo來重點介紹YbSoftwareFactory代碼生成插件二次開發所需各個類的實現。 本章節將首先來看看“IPlugInGroupRepository”插件組接口的實現。

    開始之前,說說插件加載的原理吧。YbSoftwareFactory使用了MEF來實現插件的加載,這是插件工作原理的關鍵,因此,實現的各個類必須遵循MEF的契約規范,重點是要在具體的實現類上聲明[Exprot]特性與Metadata。

    1、“IPlugInGroupRepository”接口的實現,該接口的實現類用於加載本組插件中的各個子插件。插件組將在YbSoftwareFactory左邊的導航欄出現。

    2、CastleDxWebPlugInGroupRepository源碼

CastleDxWebPlugInGroupRepository 類實現
using System;
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 {  getset; }
        
         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首先判斷有保存的模板的記錄沒有,沒有則加載默認模板並保存,當前實現的核心代碼如下:

GetTemplateInfos 方法
///   <summary>
        
///  初始化模板
        
///   </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數據庫下載

     YbSoftwareFactory主應用程序下載

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM