none
不了解Assembly.Load(path).CreateInstance(classname)这句话的意思 RRS feed

  • 问题

  • namespace Bll
    {
       public class empBll
        {
            IDAL.empDal itu = DALFactory.emp_Factory.Createusers(); //=new IDAL.empDal()行吗?这样有什么好处?     
    public DataTable GetAll() { return itu.GetAll(); } } namespace IDAL { public interface empDal { DataTable GetAll(); } } namespace DALFactory { public class emp_Factory { static readonly string path=System.Configuration.ConfigurationManager.AppSettings["DAL"]; public static IDAL.empDal Createusers() { string classname = path + ".sql_emp"; return (IDAL.empDal)Assembly.Load(path).CreateInstance(classname); //怎么转为接口类型? } } } namespace SQLServerDAL { class sql_emp:IDAL.empDal { DBunit.SQLAccess sql = new DBunit.SQLAccess(); public System.Data.DataTable GetAll() { return sql.ExecuteDataSet("select * from tab_emps join tab_roles on tab_emps.roleID=tab_roles.roleID").Tables[0]; } 这样通过反射加载程序集有什么作用?谢谢!

    2009年8月16日 6:24

答案

  • 您好,这是一个典型的工厂模式。
    目的是用来满足“对修改关闭,对扩展开发”的设计原则。
    1、IDAL.empDal itu = DALFactory.emp_Factory.Createusers();//接口是不能实例化的,只能给接口附一个实例,如果有一个类继承了empDal接口,可以用new 来实例并赋值,但这样就把实现与接口耦合在一起了,不便于日后扩展,如果这句用工厂来创建实例,只需要修改System.Configuration.ConfigurationManager.AppSettings["DAL"];  对应的xml配置文档的值,就可以将sql替换成oracl,不用重新编译,就可达到扩展目的。

    2、return (IDAL.empDal)Assembly.Load(path).CreateInstance(classname); //怎么转为接口类型?
        这个就是一个多态,CreateInstance方法相当与new的作用。在这里实例化了一个类名为classname的类,这个类必须是继承IDAL.empDal接口的。

    2009年8月16日 9:23

全部回复

  • 您好,这是一个典型的工厂模式。
    目的是用来满足“对修改关闭,对扩展开发”的设计原则。
    1、IDAL.empDal itu = DALFactory.emp_Factory.Createusers();//接口是不能实例化的,只能给接口附一个实例,如果有一个类继承了empDal接口,可以用new 来实例并赋值,但这样就把实现与接口耦合在一起了,不便于日后扩展,如果这句用工厂来创建实例,只需要修改System.Configuration.ConfigurationManager.AppSettings["DAL"];  对应的xml配置文档的值,就可以将sql替换成oracl,不用重新编译,就可达到扩展目的。

    2、return (IDAL.empDal)Assembly.Load(path).CreateInstance(classname); //怎么转为接口类型?
        这个就是一个多态,CreateInstance方法相当与new的作用。在这里实例化了一个类名为classname的类,这个类必须是继承IDAL.empDal接口的。

    2009年8月16日 9:23
  • 你好CreateInstance方法也是通过Activator类来创建类的实例 这种情况只需要你知道类的完全限定名就可以创建特定的实例

    由于创建的实例实现了接口 所以可以直接转换


    这种情况如Jiyuan所述,一般一个网站系统 可以定义一些接口中定义一些方法,然后针对不同的数据库分别有类来实现这个接口 只需要针对不同的情况配置好就可以了
    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://hi.baidu.com/1987raymond
    2009年8月17日 1:13
    版主