zoukankan      html  css  js  c++  java
  • NET工厂模式架构

    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

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

     
    分类: .NET MVC
  • 相关阅读:
    mysql数据库常用指令
    解决windows的mysql无法启动 服务没有报告任何错误的经验。
    “Can't open file for writing”或“operation not permitted”的解决办法
    启动Apache出现错误Port 80 in use by "Unable to open process" with PID 4!
    如何打开windows的服务services.msc
    常见的HTTP状态码 404 500 301 200
    linux系统常用的重启、关机指令
    (wifi)wifi移植之命令行调试driver和supplicant
    linux(debian)安装USB无线网卡(tp-link TL-WN725N rtl8188eu )
    alloc_chrdev_region申请一个动态主设备号,并申请一系列次设备号
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/5415458.html
Copyright © 2011-2022 走看看