当前位置:首页 > .Net > C#MVC之抽象工厂

C#MVC之抽象工厂

现在有些公司里面招聘的人员,要求越来越来高了,MVC也是web开发人员必备的一项技能,今天在这里与大家探讨下MVC的一个小方向。
程序员
与普通的三层架构不同,三层架构采用了全新的体系,也颠覆了以前开发web的方式,抽象工厂模式是我们项目开发中非常常见的一种模式,属于创建型模式。那么什么是模式呢?世上本没有所谓的模式,用的人多了也就有了。我们经常看到的各种框架,其实就是各种设计模式的一个集合。

抽象工厂

每一个模式都是针对一定问题的解决方案。抽象工厂模式与工厂方法模式的最大区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则需要面对多个产品等级结构。当每个抽象产品都有多于一个的具体子类的时候,工厂角色怎么知道实例化哪一个子类呢?比如每个抽象产品都有两个具体产品。抽象工厂模式提供两个具体工厂角色,分别对应于这两个具体产品角色,每一个具体工厂角色只负责某一个产品角色的实例化。每一个具体工厂类只负责创建抽象产品的某一个具体子类的实例。我这里主要给大家看工作中通常会见到的方式,虽然很low,但是很多项目就是这么弄的,只是有一些项目用反射来代替具体实例化某个类对象了。

在典型的三层架构中,我们经常会看到这样的项目结构,为了演示新建了两个实体类,Msg和Users
MVC
先看下数据访问层的抽象工厂和工厂
AbsFactoryDAL.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace DALFactory
{
    /// <summary>
    /// 数据 抽象工厂类
    /// </summary>
    public abstract class AbsFactoryDAL
    {
        /// <summary>
        /// 根据配置文件 获取 实体数据工厂 对象
        /// </summary>
        /// <returns></returns>
        public static AbsFactoryDAL GetFatory()
        {
            string strType = System.Configuration.ConfigurationManager.AppSettings["dalType"].ToString();
            AbsFactoryDAL dalFactory = null;
            switch (strType)
            { 
                case "dal":
                    dalFactory = new DALFactory();
                    break;
                case "dalA":
                    dalFactory = null;
                    break;
            }
            return dalFactory;
        }
 
        public abstract IDAL.IUsers GetUser();
        public abstract IDAL.IMsg GetMsg();
    }
}

DALFactory.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace DALFactory
{
    /// <summary>
    /// 数据工厂,只负责生成 数据层 DAL 项目里的 数据操作类
    /// </summary>
    public class DALFactory:AbsFactoryDAL
    {
        public override IDAL.IUsers GetUser()
        {
            return new DAL.Users();
        }
 
        public override IDAL.IMsg GetMsg()
        {
            return new DAL.Msg();
        }
    }
}

接下来是业务逻辑层的抽象工厂和具体工厂
MVCFactory
AbsFactoryBLL.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace BLLFactory
{
    /// <summary>
    /// 业务抽象工厂类
    /// </summary>
    public abstract class AbsFactoryBLL
    {
        /// <summary>
        /// 根据配置文件 获取 实体业务工厂 对象
        /// </summary>
        /// <returns></returns>
        public static AbsFactoryBLL GetFatory()
        {
            string strType = System.Configuration.ConfigurationManager.AppSettings["bllType"].ToString();
            AbsFactoryBLL bllFactory = null;
            switch (strType)
            { 
                case "bll":
                    bllFactory = new BLLFactory();
                    break;
                case "blla":
                    bllFactory = new BLLFactoryA();
                    break;
            }
            return bllFactory;
        }
 
        public abstract IBLL.IUsers GetUser();
        public abstract IBLL.IMsg GetMsg();
    }
}

BLLFactory.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace BLLFactory
{
    /// <summary>
    /// 业务工厂,只负责生成 业务层 BLL 项目里的 业务类
    /// </summary>
    public class BLLFactory:AbsFactoryBLL
    {
        public override IBLL.IUsers GetUser()
        {
            return new BLL.Users();
        }
 
        public override IBLL.IMsg GetMsg()
        {
            return new BLL.Msg();
        }
    }
}

BLLFactoryA.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace BLLFactory
{
    /// <summary>
    /// 负责 生产 BLLA 项目里的业务类对象
    /// </summary>
    public class BLLFactoryA:AbsFactoryBLL
    {
        public override IBLL.IUsers GetUser()
        {
            return new BLLA.Users();
        }
 
        public override IBLL.IMsg GetMsg()
        {
            return new BLLA.Msg();
        }
    }
}

web.config

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?xml version="1.0" encoding="utf-8"?>
 
<!--
  有关如何配置 ASP.NET 应用程序的详细信息,请访问
  http://go.microsoft.com/fwlink/?LinkId=169433
  -->
 
<configuration>
 
  <appSettings>
    <add key="bllType" value="bll"/>
    <add key="dalType" value="dal"/>
  </appSettings>
 
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
 
</configuration>

今天在这里跟大家简单的介绍了MVC,相信大家已经有了自己的理解,如果有哪里地方写的不对,请大家及时给出指正。

  • << 怎样通过建一个网站来获取想要的成功?
  • 深入了解MD5加密 >>
  • 作者:
    除非注明,本文原创:知道91,欢迎转载!转载请以链接形式注明本文地址,谢谢。
    原文链接:http://www.zhidao91.com/mvcfactory/

    相关文章 近期热评 最新文章

    • 使用微信JDK实现微信接口签名验证
      要使用微信的接口必须在绑定的域名下测试;签名必须先向微信请求到access_token,然后用access_token再去请求jsapi_ticket,最后用jsapi_ticket和相关的参数按照ASCII码...
    • oracle数据库相关操作注意事项
      修改Oracle SGA(共享内存) 很多网站说修改Oracle的内存通过命令 如果你这么做了,那么恭喜你,你的Oracle数据库无法启动了。如果你已经这么做了,恢复Oracle启动的方...
    • oracle数据库相关操作注意事项
      修改Oracle SGA(共享内存) 很多网站说修改Oracle的内存通过命令 如果你这么做了,那么恭喜你,你的Oracle数据库无法启动了。如果你已经这么做了,恢复Oracle启动的方...
    • 使用微信JDK实现微信接口签名验证
      要使用微信的接口必须在绑定的域名下测试;签名必须先向微信请求到access_token,然后用access_token再去请求jsapi_ticket,最后用jsapi_ticket和相关的参数按照ASCII码...
    • ABP开发指南系列教程(2) – 多层架构...
      为了减少复杂性和提高代码的可重用性,采用分层架构是一种被广泛接受的技术。为了实现分层的体系结构,ABP遵循DDD(领域驱动设计)的原则,将工程分为四个层: 展现层(...
    • ABP开发指南系列教程(1) – 入...
      ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称。 ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应用程序的新起点,它旨在成为一个通用的WE...
    • Windows下 JIRA + Agile + Mysql 破解...
      本文讲述了Windows下 JIRA + Agile + Mysql 破解安装示例教程
    • c#类的构造函数继承关系示例剖析
      本文通过示例代码讲解了c#子类的构造函数与父类的关系,子类怎样集成父类的构造函数的。