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 ...
随机推荐
- Java GUI编程-(项目代码_扫雷_弹钢琴)
--扫雷 package com;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionLis ...
- fzu1036四塔问题(汉诺塔问题拓展)
#include<iostream> #include<cstdio> #include<cmath> using namespace std; ]; int ru ...
- IIS设置session时长
打开IIS管理器,选择要设置的session的网站,打开右边窗口的会话状态.选择状态服务器,设置连接字符串,并在服务管理开户状态服务 ASP.NET State Service
- 概率dp专场
专题链接 第一题--poj3744 Scout YYF I 链接 (简单题) 算是递推题 如果直接推的话 会TLE 会发现 在两个长距离陷阱中间 很长一部分都是重复的 我用 a表示到达i-2步的概率 ...
- OSChina码云试用
首先在码云申请账户. 从 http://git-scm.com/download 下载window版的客户端.下载好,一步一步安装即可. $git config --global user.name ...
- AVSampleBufferDisplayLayer----转
http://blog.csdn.net/fernandowei/article/details/52179631 目前大多数iOS端的视频渲染都使用OpenGLES,但如果仅仅为了渲染而不做其他的例 ...
- javascript学习内容--改变样式、取消设置、显示内容、隐藏内容
<head> <style> body{font-size:12px;} #txt{ height:400px; width:600px; border:#333 solid ...
- 写日志 log 到文件夹
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...
- C# for循环 循环中先求长度还是使用list.Count,哪个效率高
这种问法可能问的不好.应该说成是第一种方法完全没有必要,很多人可能以为那样会为代码带来效率,而实际上是不会给效率带来任何提升. 因为事实上,索引器内部,为了安全期间,还是会去求整个list的count ...
- NodeJS中的异步I/O、事件驱动
nodejs的主要特点是单线程.异步I/O.事件驱动.让我们先大概了解一下这些名词的意思. 单线程 单线程是任务按照顺序执行的,并且每次只执行一个任务,只有前面的任务执行完成以后,后面的任务才执行.在 ...