这样的设计下,对程序集的引用如何处理呢?目的是解藕。
有如下的设计:
<项目1> 中定义了接口IHandler 。
<项目2> 中定义了A_Handler类实现了接口IHandler 。
<项目3> 是最终的调用者。
将来类似 <项目2> 中A_Handler的类数量未知,但肯定的是都会实现IHandler 。在程序部署后不想为添加这样的类而重新编译整个程序,所以想把 <项目2> 单独编译为dll,将来新增这样的类就可以直接把新的dll复制的指定目录,修改配置便可。
由 <项目3> 的调用者通过反射来创建A_Handler的实例(可以在程序启动时根据配置文件创建所有类似A_Handler的实例)。
**现在有一个问题:在 <项目3> 的调用者中,string url = ((A_Handler)aHandler).BuildURL (); 这句代码中需要对声明为IHandler的实例aHandler做转型处理,即需要加上(A_Handler),这样还得在编译前为 <项目3> 添加A_Handler.dll为引用,与初衷不符,Program 类和A_Handler类不能彻底解耦。
**这种情况需如何解决,可以动态的通过编程添加引用吗?并使用 "A_Handler "字符串去做aHandler的转型吗?
演示代码:
<项目1>
namespace XXX{
public interface IHandler {
string Access (string url);
}
}
<项目2>
namespace XXX{
public class A_Handler:IHandler{
public string BuildURL(){
Console.WriteLine ( "build...OK ");
}
public string Access (string url) {
stirng xml = "...xml string... ";
Console.WriteLine( "access...OK ");
return xml;
}
}
}
<项目3>
namespace XXX {
class Program {
static void Main (string[] args) {
IHandler aHandler = (IHandler)Assembly.LoadFile(@ "D:\TEST\DotNet\XXX\bin\Debug\A_Handler.dll ").CreateInstance( "XXX.A_Handler ");
string url = ((A_Handler)aHandler).BuildURL ();
string xml = aHandler.Access (url);
Console.WriteLine (xml);
}
}
}
------解决方案--------------------你这种设计实现就是项目3对项目2的依赖 是你实现不合理造成的
------解决方案--------------------1、项目1和项目3完全可以合并
2、如果你需要使用A_Handle而不能使用IHandle,那么你的这个接口还有什么意义?把所需要的东西抽象到IHandle内……