日期:2014-05-19  浏览次数:20992 次

这样的设计下,对程序集的引用如何处理呢?目的是解藕。
有如下的设计:

<项目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内……