c# 反射应用之工厂
反射是.net的核心功能,十分的强大。但是好像微软封装的太过了,作为程序员,在实际项目中我很少用到反射(估计是参加的大型项目太少了,需要交互第三方的项目太少了)。
工厂模式是软件设计模式中重要的一种,在面向接口编程中,怎么把接口与实现接口的类进行关联而不是在程序中直接使用
SupportLaw.Dal.Dic_Table dal = new SupportLaw.Dal.Dic_Table();
这样违反了 具体不能依赖具体的(依赖倒置原则) 设计模式。通俗来点讲 这样直接做有主要两点的缺点:
1:dal里面会有大量的操作数据库代码。(东软生成也有很多哦)。每次new dal,其实我们只需要其中的一个(一类型)或者几个方法(这个就是接口哦)。都在实例化不是很浪费。
根据里氏替换原则,这里使用接口来实例化的类型(所以接口的设计部是东软生成啊!!我的设计一般是 添加修改删除 作为一个接口。查询(各种各样的查询) 作为另一个接口)。
SupportLaw.IDal.IDic_Table dal = new SupportLaw.Dal.Dic_Table();
2: 项目的可维护性。(公司真实的例子:公司一个项目面临演示,除了问题。这个项目从数据提取,数据处理,数据展示 三个人做的。。然后一个人加班另两个一起加班。苦逼!当然里面有各种各样的原因。其中最重要的原因就是 相互 依赖,没有统一的规则(接口))。为了项目的可维护性,为了以后需求变动的时候(软件项目经常的事情)。
好了。使用接口解决了上面的两个问题了,但是把实例化语句放在bll层处理也是不好的吧。因为你如果那样做了,你的bll层是必须引用 DAL IDal层。比不做改动之前你的项目引用的还要多一个IDal。这个时候我们需要一个中间层来处理接口与实现类的关联。因为具有统一的特性(这里用词不好,但是不知道用啥了)--给一个接口,返回一个接口实现类。所以这里用到了工厂。
传入的参数 泛型 T。具体代码如下:
public static T Creat<T>()
{
string str = typeof(T).Name; //获取类型名称
Assembly assembly = Assembly.Load("SupportLaw.Dal"); //加实现类载程序集
Type[] types = assembly.GetTypes(); //获取所有类型
foreach (var t in types)
{
if (t.GetInterface(str) != null) //如果存在实现类继承了接口T,则返回实现T类,否则返回 default(T)
{
var userBll = (T)Activator.CreateInstance(t);
return userBll;
}
}
return default(T);
}
c# 反射应用之工厂的更多相关文章
- Java使用反射机制优化工厂方法
我先举个例子,有一个接口People,这个接口有一个方法: package com.wjy.reflect; public interface People { public abstract voi ...
- [Java反射机制]用反射改进简单工厂模式设计
如果做开发的工作,工厂设计模式大概都已经深入人心了,比较常见的例子就是在代码中实现数据库操作类,考虑到后期可能会有数据库类型变换或者迁移,一般都会对一个数据库的操作类抽象出来一个接口,然后用工厂去获取 ...
- Java反射机制demo(七)—反射机制与工厂模式
Java反射机制demo(七)—反射机制与工厂模式 工厂模式 简介 工厂模式是最常用的实例化对象模式. 工厂模式的主要作用就是使用工厂方法代替new操作. 为什么要使用工厂模式?直接new不好吗? 直 ...
- 基于C#反射机制的工厂模式
简单介绍 反射提供了描写叙述程序集.模块和类型的对象(Type 类型). 能够使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或訪问其字段和属性. 假设代码中使用了特 ...
- 用反射技术替换工厂种的switch分支(14)
首先给大家拜个晚年,祝大家新春快乐,万事如意,鸡年大吉. 好了,前面我们讲了很多的工厂模式,其中,有个很明显的特点,工厂中,有一个方法,里面有很多的swich case 分支,我们前面说过,我们可以 ...
- Java反射机制在工厂模式中的应用
在本篇文章中就不详细介绍工厂模式,主要介绍一下反射在工厂模式中的使用,让读者对反射机制带来的好处有更深的认识. 首先看一下简单工厂模式 简单工厂模式(simple factory)是类的创建模式,又叫 ...
- Java反射机制与工厂模式
工厂模式属于创建型模式,它提供了一种创建对象的最佳方式. 它的特点是:客户端的程序类不直接牵扯到对象的实例化管理,只与接口发生关联,通过工厂类获取指定接口的实例化对象. 简单工厂模式如下: inter ...
- 简单架构:反射实现抽象工厂+IDAL接口完全独立DAL
一.普通架构中存在的问题 StudentDB数据库,包含一张StudentInfoTB表,结构如下: s_id int primary key identity(1,1), s_name Nvarch ...
- Java反射机制(五):使用反射增强简单工厂设计模式
关于简单工厂设计模式的讲解,可参考博文<设计模式: 简单工厂模式>,此处不再介绍: 我们先观察之前介绍的关于简单工厂: public class OperateFactory { pub ...
随机推荐
- 为什么当多个inline-block的div中,如果有的div没有内容而有的div有内容,有内容的会下沉?
为什么当多个inline-block的div中,如果有的div没有内容而有的div有内容,有内容的会下沉? 就像这样 两个div高度相同,第二个我写了一个1当作 有内容吧,它就下沉了... 奇怪... ...
- Microsoft Web Platform Installer 5.0
Microsoft Web Platform Installer 5.0 Web 平台安装器 https://www.microsoft.com/web/downloads/platform.aspx
- Tomcat 6 --- JNDI详解
点击查看推荐博文
- jQuery.is() 函数
is() 函数 判断当前对象是否符合指定表达式 语法 $selector.is(表达式)//指定表达式 返回值 返回值为布尔型(true/false) 当当前对象包含多个元素时,只要任意元素满足指定表 ...
- 如何透过HTC Vive拍摄Mixed Reality (混合现实)影片
https://www.vive.com/cn/forum/1706?extra=page%3D1 也许你是一位开发者,想为自己的HTC Vive游戏制作酷炫的宣传片:或者你是游戏主播,想为观众带来高 ...
- ORACLE RAISE
ORACLE 出错信息的输出 偷懒的办法直接在Exception 后使用raise但是错误信息不是很完整使用RAISE_APPLICATION_ERROR(-20999, DBMS_UTILITY.f ...
- Linux下如何修改Apache根目录
创建自己需要更改的新目录,并更改宿主权限为apache用户 chown -R apache:apache /mnt/www 停止Apache服务 service httpd stop 3 修改Ap ...
- [Java] 特殊正则-替换字符串
public class Test { public static void main(String[] args) { String str = "2412rhttp://192.168. ...
- UnsupportedClassVersionError 错误解决办法
偶然遇到关于版本问题的错误,为了以后查找方便记录下来.有更好的办法欢迎大家更正. 错误内容: Exception in thread "main" java.lang.Unsupp ...
- linux 挂载光盘:mount: you must specify the filesystem type
尝试挂载光盘镜像时出现mount: you must specify the filesystem type 使用-t auto -t iso9660 或不加参数都搞不定,最后在以下链接找到解决办法: ...