zoukankan      html  css  js  c++  java
  • 根据业务自己设计的.NET工厂模式架构

    最近项目的架构需要做调整优化,根据业务需要写了一个简单的工厂模式架构

    项目介绍:整个系统分为三大平台(这里用A,B,C来标示),每个平台又细分为多个APP客户端(每个APP都有appid来区分)

    因为每个平台的业务处理几乎不一样,而属于同一个平台的app客户端业务又几乎一样,但也有要特殊情况处理的。

    直接代码展示:

    首先是接口和抽象类

        /// <summary>
        /// 商品接口类
        /// </summary>
        public interface IProductBLL
        {
            string GetBLLName(int appid);
    
            string GetAction();
        }
    
        /// <summary>
        /// 抽象类
        /// </summary>
        public abstract class BaseProductBLL : IProductBLL
        {
    
            public static IProductBLL GetProductBll(int appid)
            {
                //定义appid属于哪个平台,这里可以用config配置或者枚举定义
                int[] A_appid = new int[] {10001,10003,10005 };
                int[] B_appid = new int[] { 10002, 10004, 10006 };
                int[] C_appid = new int[] { 10007, 10008, 100009 };
                IProductBLL bll = null;
    
                if (A_appid.Contains(appid))//此appid属于A平台
                {
                    bll = BaseProduct_A_BLL.GetProductBll(appid);
                }
                else if (B_appid.Contains(appid))//此appid属于B平台
                {
                    bll = BaseProduct_B_BLL.GetProductBll(appid);
                }
                else if (C_appid.Contains(appid))//此appid属于C平台
                {
                    bll = BaseProduct_C_BLL.GetProductBll(appid);
                }
    
                return bll;
            }
    
            public abstract string GetBLLName(int appid);
            public abstract string GetAction();
        }

    接下来是各平台的通用类

        /// <summary>
        /// A平台通用类
        /// </summary>
        public class BaseProduct_A_BLL : BaseProductBLL
        {
            private static IProductBLL _instanceA = null;
            public static IProductBLL InstanceA
            {
                get
                {
                    if (_instanceA == null)
                    {
    
                        _instanceA = new BaseProduct_A_BLL();
                    }
                    return _instanceA;
                }
            }
            public static IProductBLL GetProductBll(int appid)
            {
                IProductBLL bll = null;
    
                switch (appid)
                { 
                    case 10003:
                        bll=Product_10003_BLL.Instance10003;
                        break;
                    default:
                        bll = BaseProduct_A_BLL.InstanceA;
                        break;
                }
    
                return bll;
            }
    
            public override string GetBLLName(int appid)
            {
                return "" + appid + "调用了BaseProduct_A_BLL.GetBLLName";
            }
    
            public override string GetAction()
            {
                return "调用了BaseProduct_A_BLL.GetAction";
            }
    
        }
    
        /// <summary>
        /// B平台通用类
        /// </summary>
        public class BaseProduct_B_BLL : BaseProductBLL
        {
            private static IProductBLL _instanceB = null;
            public static IProductBLL InstanceB
            {
                get
                {
                    if (_instanceB == null)
                    {
    
                        _instanceB = new BaseProduct_B_BLL();
                    }
                    return _instanceB;
                }
            }
            public static IProductBLL GetProductBll(int appid)
            {
                IProductBLL bll = null;
    
                switch (appid)
                {
                    default:
                        bll = BaseProduct_B_BLL.InstanceB;
                        break;
                }
    
                return bll;
            }
    
            public override string GetBLLName(int appid)
            {
                return "" + appid + "调用了BaseProduct_B_BLL.GetBLLName";
            }
    
            public override string GetAction()
            {
                return "调用了BaseProduct_B_BLL.GetAction";
            }
    
        }
    
        /// <summary>
        /// C平台通用类
        /// </summary>
        public class BaseProduct_C_BLL : BaseProductBLL
        {
            private static IProductBLL _instanceC = null;
            public static IProductBLL InstanceC
            {
                get
                {
                    if (_instanceC == null)
                    {
    
                        _instanceC = new BaseProduct_C_BLL();
                    }
                    return _instanceC;
                }
            }
            public static IProductBLL GetProductBll(int appid)
            {
                IProductBLL bll = null;
    
                switch (appid)
                {
                    default:
                        bll = BaseProduct_C_BLL.InstanceC;
                        break;
                }
    
                return bll;
            }
    
            public override string GetBLLName(int appid)
            {
                return "" + appid + "调用了BaseProduct_C_BLL.GetBLLName";
            }
    
            public override string GetAction()
            {
                return "调用了BaseProduct_C_BLL.GetAction";
            }
        }

    假如appid为10003的需要拓展,需在A平台通用类中添加case 10003 的逻辑,并创建对应的拓展类Product_10003_BLL并继承A平台通用类BaseProduct_A_BLL

        /// <summary>
        /// appid为10003拓展类
        /// </summary>
        public class Product_10003_BLL : BaseProduct_A_BLL
        {
            private static IProductBLL _instance10003 = null;
            public static IProductBLL Instance10003
            {
                get
                {
                    if (_instance10003 == null)
                    {
    
                        _instance10003 = new Product_10003_BLL();
                    }
                    return _instance10003;
                }
            }
    
            public Product_10003_BLL()
            { 
            }
    
            public override string GetBLLName(int appid)
            {
                return "" + appid + "调用了Product_10003_BLL.GetBLLName";
            }
        }

    如上appid为10003的拓展类重写了GetBLLName方法。

    接下来就是在Controlle层中调用

        /// <summary>
        /// 基类控制类
        /// </summary>
        public class BasesController : Controller
        {
            public BasesController()
            { 
            }
    
            protected int Appid
            {
                get { return Convert.ToInt32(HttpContext.Request["appid"]); }
            }
    
            public IProductBLL ProductBll
            {
                get
                {
                    return BaseProductBLL.GetProductBll(Appid);
                }
            }
        }
    
        public class ProductController : BasesController
        {
            //
            // GET: /Product/
            public ActionResult Index()
            {
                string bllname = ProductBll.GetBLLName(Appid);
                string actionName = ProductBll.GetAction();
                ViewData["bllname"] = bllname;
                ViewData["actionName"] = actionName;
                return View();
            }
    
        }

    以上参数appid是必传,以上代码没有对不传参数且参数值得正确性做判断的异常处理,这里主要是记录对于这个系统的交互设计,另外数据访问层DAL也没有写出来,可以按照上面的设计思路进行创建

    下面是我简单测试打印出来的

    ViewData["bllname"] 
    ViewData["actionName"] 的值

    访问http://localhost:37842/product/index?appid=10005

    也就是参数appid为10005 时打印出 :

    10005调用了BaseProduct_A_BLL.GetBLLName

    调用了BaseProduct_A_BLL.GetAction

    当appid为10003时打印出:

    10003调用了Product_10003_BLL.GetBLLName

    调用了BaseProduct_A_BLL.GetAction

    当appid为10002时打印出:

    10002调用了BaseProduct_B_BLL.GetBLLName

    调用了BaseProduct_B_BLL.GetAction

    此文仅记录笔记,各位大神可以多多指教!

  • 相关阅读:
    【微积分】 02
    【微积分】 01
    【线性代数】 09
    云南国庆八日游策划书
    Kubectl工具常用命令
    Linux 常用命令缩写及对应的
    kubectl工具的windows安装方法
    Intellij IDEA工具的常用快捷键
    如何理解docker镜像build中的上下文
    【转】在服务器上排除问题的头五分钟&常用命令
  • 原文地址:https://www.cnblogs.com/gangtienanzi/p/5413944.html
Copyright © 2011-2022 走看看