博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
以查询功能谈下,三层架构中的工厂模式与其中反射的应用
阅读量:5062 次
发布时间:2019-06-12

本文共 3376 字,大约阅读时间需要 11 分钟。

 相信用过动软代码生成器的童学对其中的工厂模式一定很了解;
没用过的熟悉一下(哈哈。打广告啦)
本人就以登陆功能谈下自己对其中的了解有不足之处。请大家多多指教
工厂模式与平常的三层架构有以下不同
1.从思想上来说。三层架构就不说啦。工厂模式是把数据访问层抽象化,
 以应对不同的数据库。
其中成员有:抽象功能成员:它是具体功能的接口层。(核心)
               具体功能成员:它是对抽象功能的继承;也是对不同数据库的不同实现
(嘿嘿,有点抽象。)
2.从具体模式来说
   
 工厂模式把原来的数据访问层 又抽象两层 
既接口层与具体实现层;
大家看下面代码 
假如我们要实现一个网站的简单登陆功能。
我们看下工厂模式的 实现方式
实体层代码
 1  
/// 
<summary>
 2 
    
///
 user_t:用户类
 3 
    
/// 
</summary>
 4     [Serializable]
 5     
public 
partial 
class user_t
 6     {
 7         
public user_t()
 8         { }
 9         
#region 用户类
10         
private 
int _userid;
11         
private 
string _name_r;
12         
private 
string _password_r;
13         
private 
string _email_r;
14         
private DateTime _time_r = DateTime.Now;
15         
/// 
<summary>
16 
        
///
 
17 
        
/// 
</summary>
18         
public 
int userid
19         {
20             
set { _userid = value; }
21             
get { 
return _userid; }
22         }
23         
/// 
<summary>
24 
        
///
 用户名
25 
        
/// 
</summary>
26         
public 
string name_r
27         {
28             
set { _name_r = value; }
29             
get { 
return _name_r; }
30         }
31         
/// 
<summary>
32 
        
///
 密码
33 
        
/// 
</summary>
34         
public 
string password_r
35         {
36             
set { _password_r = value; }
37             
get { 
return _password_r; }
38         }

 实体层相信大家一定很了解

它就是对各个对象(表)转化为实体

业务逻辑层

 

 1  
public 
partial 
class blog_t
 2     {
 3         
private 
readonly Iblog_t dal = DataAccess.Createblog_t();
 4         
public blog_t()
 5         { }
 6         
#region  BasicMethod
 7 
 8         
/// 
<summary>
 9 
        
///
 得到最大ID
10 
        
/// 
</summary>
11         
public 
int GetMaxId()
12         {
13             
return dal.GetMaxId();
14         }
15 
16         
/// 
<summary>
17 
        
///
 是否存在该记录
18 
        
/// 
</summary>
19         
public 
bool Exists(
int blogid)
20         {
21             
return dal.Exists(blogid);

22         } 

 

业务层是与界面层交互。主要是为啦对各个功能的具体实现 

 

然后看数据访问层这个是重点 1  /// <summary>

在这里我们以msSQL数据库为例但又不确定数据库是否改变

所以在 数据访问以接口方式抽象各种功能

 

 2 
    
///
 接口层blog_t
 3 
    
/// 
</summary>
 4     
public 
interface Iblog_t
 5     {
 6         
#region  成员方法
 7         
/// 
<summary>
 8 
        
///
 得到最大ID
 9 
        
/// 
</summary>
10         
int GetMaxId();
11         
/// 
<summary>
12 
        
///
 是否存在该记录
13 
        
/// 
</summary>
14         
bool Exists(
int blogid);

 

然后在建不同类库存放针对不同数据库的具体方法

以sql数据库为例

 1     
public 
partial 
class blog_t:Iblog_t
 2     {
 3         
public blog_t()
 4         {}
 5         
#region  BasicMethod
 6     
 7     
 8         
///
 
<summary>
 9 
        
///
 是否存在该记录
10 
        
///
 
</summary>
11 
        
public 
bool Exists(
int blogid)
12         {
13             StringBuilder strSql=
new StringBuilder();
14             strSql.Append(
"
select count(1) from blog_t
");
15             strSql.Append(
"
 where blogid=@blogid
");
16             SqlParameter[] parameters = {
17                     
new SqlParameter(
"
@blogid
", SqlDbType.Int,
4)
18             };
19             parameters[
0].Value = blogid;
20 
21             
if ((
int)  DbHelperSQL.ExecuteScalar(CommandType.Text, strSql.ToString(), parameters) > 
0)
22             {
23                 
return 
true;
24             }
25             
else
26             {
27                 
return 
false;
28             }
29         }

但怎样在业务逻辑层引用关于sql数据库的数据访问层代码那?

大家注意到业务逻辑层的这一句没 

1   
private 
readonly Iblog_t dal = DataAccess.Createblog_t();

然后我们再看一下这个类的代码

  private static readonly string AssemblyPath = ConfigurationManager.AppSettings["DAL"];

        
///
 
<summary>
        
///
 创建blog_t数据层接口。
        
///
 
</summary>
        
///
 //使用缓存
        
private 
static 
object CreateObject(
string AssemblyPath, 
string classNamespace)
        {
            
object objType;    
                    objType = Assembly.Load(AssemblyPath).CreateInstance(classNamespace);
                    
            
return objType;
        }
        
public 
static blog.idal.Iblog_t Createblog_t()
        {
            
string ClassNamespace = AssemblyPath + 
"
.blog_t
";
            
object objType = CreateObject(AssemblyPath, ClassNamespace);
            
return (blog.idal.Iblog_t)objType;
      
        }

还有配置文件中的这一句

  <add key="DAL" value="blog.sqldal"/>

有些童学明白啦吧?在这里用啦一下

反射的技术

其中以

 

 Assembly.Load(AssemblyPath)

反射配置文件标注的程序集。然后以CreateInstance(classNamespace)实例化关于sql数据访问层的类

    注意CreateInstance()一定是命名空间.类名,否则创建的实例为空

个人建议在建类库时程序集名称与类库的命名空间一致(好引用方便)

总结:

总的来说使用它就是为啦以后程序的更改扩展方便

转载于:https://www.cnblogs.com/zhang888/archive/2012/11/08/zhang2.html

你可能感兴趣的文章
接口测试系列:工作中所用(七:BSTestRunner.py 生成测试报告)
查看>>
用Android-X86和VirtualBox打造高性能Android开发环境
查看>>
canvas绘制五角星
查看>>
mvc5 @RenderSection("scripts", required: false) 什么意思
查看>>
查看dump oracle数据块查看
查看>>
Jmeter 指令记录
查看>>
使用mstest.exe 命令行跑test case(不安装Visual Studio 2010)
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_1-常用API_1_第5节 String类_10_练习:统计输入的字符串中...
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_04-集合_01 Collection集合_4_Iterator接口介绍...
查看>>
seureCRT快捷键
查看>>
大道至简第一章读后感
查看>>
在MFC中使用ShockwaveFlash插件播放swf文件(VS2008-VC++MFC)
查看>>
Notepad++打开as文件时使用as3的语法高亮
查看>>
font
查看>>
POJ - 2456 Aggressive cows
查看>>
LeetCode OJ 147. Insertion Sort List
查看>>
JavaScript奇技淫巧44招
查看>>
【iCore2双核心板】SRAM 读写实验(基于Verilog语言)
查看>>
企业该如何才能加强与客户之间的关系
查看>>
文成小盆友python-num4 装饰器,内置函数
查看>>