在用工厂模式做三层架构开发的时候 无法反射创建类实例的发现的错误

这些天,我在试着用工厂模式和接口来做三层架构的时候,碰到一个问题,开始是非常棘手啊!!
调试了半天也没有发现问题的所在,只是objType = Assembly.Load(path).CreateInstance(CacheKey); //反射创建这一句的时候老是出错。。我唯有改成创建我需要的某一个具体的类进行调试的时候,才一个个问题解决;
但问题来了,我解决掉那里之后,改回来还是不行啊;
在经过多次调试发现,Assembly不是有关程序集操作的类吗;
所以将之改成程序集名称,同时也把程序集的名称改成命名空间的前缀;
统一用PowerNet.DataLog;将命名空间的前缀改成程序集的名称(在此要修改一下程序集的名称“工程名”->“属性”里面就以修改);
这样就调试通过了;

说明:本代码中用到的这些都是通过一个生成代码的工具生成的,这个生成工具非当没有让我尝到“甜头”反而让我苦了不少,当然也正因如此,也对于三层架构和工厂模式有了进一步深入的一点点了解吧;呵呵...有的时候这些工具生成的代码的确感觉编译通过不了。调试很久也无奈,但试着顺藤摸瓜一个个有耐心地去解决的话。还是能够搞定的。当然最重要的是在这个过程中能学到不少东西;

下面是DALFactory整个类DataAccess的源码

using  System;
using  System.Reflection;
using  System.Configuration;
using  PowerNet.DataLog.IDAL.Table;
namespace  PowerNet.DataLog.DALFactory.Table
{
    
/// <summary>
    
/// 抽象工厂模式创建DAL。
    
/// web.config 需要加入配置:(利用工厂模式+反射机制+缓存机制,实现动态创建不同的数据层对象接口)  
    
/// DataCache类在导出代码的文件夹里
    
/// 可以把所有DAL类的创建放在这个DataAccess类里
    
/// <appSettings>  
    
/// <add key="DAL" value="PowerNet.DataLog" /> (这里的根据实际情况更改为自己项目的程序集名称)
    
/// </appSettings> 
    
/// </summary>

    public sealed class DataAccess
    
{
        
private static readonly string path = System.Configuration.ConfigurationSettings.AppSettings["DAL"];
        
/// <summary>
        
/// 创建对象或从缓存获取
        
/// </summary>

        public static object CreateObject(string path,string CacheKey)
        
{
            
object objType = DataCache.GetCache(CacheKey);//从缓存读取
            if (objType == null)
            
{
                
try
                
{
                    objType 
= Assembly.Load(path).CreateInstance(CacheKey); //反射创建
                    
                    DataCache.SetCache(CacheKey, objType);
// 写入缓存
                }

                
catch(Exception)
                
{
                    
return null;
                }

            }

            
return objType;
        }


        
/// <summary>
        
/// 创建DataAnalyse数据层接口
        
/// </summary>

        public static PowerNet.DataLog.IDAL.Table.IDataAnalyse CreateDataAnalyse()
        
{
            
string CacheKey = path+".DAL.Table.DataAnalyse";
            
object objType=CreateObject(path,CacheKey);
            
return (IDataAnalyse)objType;
        }


        
/// <summary>
        
/// 创建OnlineCount数据层接口
        
/// </summary>

        public static PowerNet.DataLog.IDAL.Table.IOnlineCount CreateOnlineCount()
        
{
            
string CacheKey = path+".DAL.Table.OnlineCount";
            
object objType=CreateObject(path,CacheKey);
            
return (IOnlineCount)objType;
        }

        
/// <summary>
        
/// 创建GameLog数据层接口
        
/// </summary>

        public static PowerNet.DataLog.IDAL.Table.IGameLog CreateGameLog()
        
{
            
string CacheKey = path+".DAL.Table.GameLog";
            
object objType=CreateObject(path,CacheKey);
            
return (IGameLog)objType;
        }


    }

}


 如果大家觉得我说得不太清楚或还有什么其它的问题可以回复;

大家一起讨论和学习一下;

共同进步!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值