工厂三层反射小问题

闲游四疯 2010-05-23 02:16:25
假设简单工厂三层 BLL DAL IDAL Factory
BLL 引用 IDAL Factory
DAL 引用 IDAL
IDAL 无引用
Factory 引用 IDAL
项目引用BLL文件 然后调用方法
会出现 反射时找不到 DAL 这个程序集dll文件 因为BLL相关类库没有引用到DAL这个类库
我是手动在前台项目直接引用DAL
我的问题就是 是在前台直接引用DAL类库吗? 还是在哪个类库里面调用? 还是我三层反射理解错了?
...全文
107 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
闲游四疯 2010-05-23
  • 打赏
  • 举报
回复
惭愧 老在小问题上纠结..捡豆失西瓜
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 vbmscommvs 的回复:]
吴伟大哥,我上次的GET,我的思路是对的吧
[/Quote]
呵呵,如果你自己测试通过,那么就肯定是对的!理论不一定是对的,测试才能判断真假。



[Quote=引用楼主 ysn1314 的回复:]
假设简单工厂三层 BLL DAL IDAL Factory
BLL 引用 IDAL Factory
DAL 引用 IDAL
IDAL 无引用
Factory 引用 IDAL
是 是在前台直接引用DAL类库吗?……
[/Quote]其实,高层程序才不关心什么DAL,只要有个IDAL做为协议就可以了。所以你对于DAL这个东西要有个灵活的认识。例如你可以实现一个以内存模拟为数据库的Class,它实现了IDAL方法;然后实现一个以SQL Server为数据库的Class,它实现了IDAL;再实现一个以 Oracle Berkeley DB 为数据库的Class,它也实现了IDAL接口。然后通过配置config文件中的两行文字,可以随时切换不同的数据库了。因此所谓DAL是一个抽闲概念,而并不是一个具体的Class。只要实现了IDAL接口的都是DAL。
闲游四疯 2010-05-23
  • 打赏
  • 举报
回复
我的意思是 Assembly.Load("程序集名") 加载web层bin文件夹下的dll
但按我上面表达的引用关系 项目web层引用BLL 没有引用DAL的话 在bin文件下找不到DAL的bll
出现错误: 未能加载文件或程序集“AccessDAL”或它的某一个依赖项
手动在项目web层添加DAL引用的话 则正确
我就是想问 是不是必须在项目web层 手动添加DAL 如果有 ACCESS MSSQL Oracle三个DAL 就得添加三个DAL?
vbmscommvs 2010-05-23
  • 打赏
  • 举报
回复
吴伟大哥,我上次的GET,我的思路是对的吧
  • 打赏
  • 举报
回复
imfor 2010-05-23
  • 打赏
  • 举报
回复
p哥的话很有道理
  • 打赏
  • 举报
回复
呵呵,你会发现,我很少说到什么“工厂”。如果没有必要搞新的类型,确实就不要制造概念出来。

反射来创建DAL对象,内容很简单,不需要工厂class,只要在你的通用类库中有个static方法就可以了。
  • 打赏
  • 举报
回复
上面,假设要返回的 DAL 对象是具有 IDomain 接口的。

关于Load,可以看msdn: http://msdn.microsoft.com/zh-cn/library/ky3942xh(VS.80).aspx
其实你既可以用一个段格式名称(只有Assembly段名称)也可以使用一个长格式名称来调用Load。这个方法会自动搜索几个目录,查找需要的文件。具体看msdn!
imfor 2010-05-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wuyq11 的回复:]
BLL 引用 IDAL Factory Model
DAL 中
public Class A:IA
{}
BLL,调用DALFactory,得到程序集指定类的实例,完成数据操作方法
[/Quote]
BLL,调用DALFactory,DALFactory(反射到DAL,转成IDAL)
  • 打赏
  • 举报
回复
一个反射代码大致这样写:
private static ConstructorInfo _CreateDomain;

static public IDomain GetDALInstance()
{
if (_CreateDomain == null)
{
var providerName = ConfigurationManager.AppSettings["DALAssemblyName"];
if (providerName == null)
throw new Exception("需要设置配置参数DALAssemblyName。");

var asm = Assembly.Load(providerName);
var className = ConfigurationManager.AppSettings["DALClass"];
if (className == null)
throw new Exception("需要设置配置参数DALClass。");

var t = asm.GetType(className);
if (t == null)
throw new Exception(string.Format("Assembly {0} 中不存在类 {1}。", asm.FullName, className));

_CreateDomain = t.GetConstructor(new Type[] { });
if (_CreateDomain == null)
throw new Exception("DALClass参数无法实例化对象。");

}
return (IDomain)_CreateDomain.Invoke(null);
}
注意是 Assembly.Load(...) 而不是 LoadFrom 更不是 LoadFile。代码没有问题,如果不能Load,你就可以查看 Assembly.Load 的具体文档,例如看看 msdn,看看你从 config 文件中提取的 DALAssemblyName 值是否符合文档中所要求的 Load 方法需要的值。
wuyq11 2010-05-23
  • 打赏
  • 举报
回复
BLL 引用 IDAL Factory Model
DAL 中
public Class A:IA
{}
BLL,调用DALFactory,得到程序集指定类的实例,完成数据操作方法

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧