【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);
            }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

存在morning

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值