1. 程式人生 > >【C#程式設計最佳實踐 三】介面使用實踐

【C#程式設計最佳實踐 三】介面使用實踐

目前使用到的介面使用方法大概就以下這兩種,之後在持續更新,第一種就是使用工廠,第二種就是字典類。接下來詳細介紹這兩種方法,用好了就可以說把多型玩兒溜了。

工廠類的使用實踐

建立工廠類

namespace Factory
{
    internal class ConverterFactory : FactoryBase<ConverterFactory, IConditionKeyBuilder>, IFactory<IConditionKeyBuilder>
    {
        public IConditionKeyBuilder NewObject
(string className) { var result = ReflectionHelper.CreateInstance<IConditionKeyBuilder>("程式集", "名稱空間." + className); if (result == null) { throw new ConfigException($"{className}反射失敗"); } return result; } } }

呼叫工廠類

呼叫的時候
 newrow.ConditionCode =
                 ConverterFactory.Instance.CreateObject("FieldCombinationConditionKeyBuilder").GetKeyMethod(newrow, tableconfig.Name);

字典類和介面組合的使用實踐

特徵碼的介面和實現類

這裡寫圖片描述
在使用的時候就可以直接依據傳入的字串來判斷

   //=====================================================特徵碼設定(依據需求判斷使用哪個方法)=============================================================
//使用介面和實現類來設定特徵碼 public static readonly Dictionary<string, ConditionKeyBuilder> conditionKeyBuilder = new Dictionary<string, ConditionKeyBuilder>() { //不同方法的解決介面 { "FieldCombinationConditionKeyBuilder",new FieldCombinationConditionKeyBuilder(MetaDataBaseName) }, { "ValueMappingConditionKeyBuilder",new ValueMappingConditionKeyBuilder() } }; /// <summary> /// 根據相應的方法名獲取相應的獲取特徵碼的方式 /// </summary> /// <param name="method"></param> /// <returns></returns> private ConditionKeyBuilder GetConditionKey(string builderName) { if (conditionKeyBuilder.ContainsKey(builderName)) { return conditionKeyBuilder[builderName]; } return null; } #region 檢測該庫所有表的資料遷移

比較規則的介面和實現類

這裡寫圖片描述

在使用的時候就可以直接依據傳入的字串來判斷

  #region 白名單設定,獲取對應方法

        //===========================================白名單設定============================
        public static readonly Dictionary<string, MethodProvider> methodProvider = new Dictionary<string, MethodProvider>() {   //不同方法的解決介面
            { "Equal",new EqualMethodProvider() },
            { "Mapping",new MappingMethodProvider() },
            { "TenanatReplace",new TenanatReplaceMethodProvider() }
        };

        /// <summary>
        /// 根據相應的方法名獲取相應的演算法處理方法
        /// </summary>
        /// <param name="method"></param>
        /// <returns></returns>
        private MethodProvider GetMethodProvider(string method)
        {
            if (methodProvider.ContainsKey(method))
            {
                return methodProvider[method];
            }
            return null;
        }

        #endregion 白名單設定,獲取對應方法

字典類獲取列名

還可以通過字典類,將對應的列序號和列明封裝到字典類,這樣之後對每行資料處理的時候可以隨時獲得當前處理欄位的欄位名,例如

 //使用字典類獲取一個列名和列次序的對映
            var dt = new Dictionary<int, String>();
            for (var j = 0; j < sourceTable.Columns.Count; j++)
            {
                var col = sourceTable.Columns[j];
                dt.Add(j, col.ColumnName);
            }