浏览:10252007-12-02 13:03   来自彭成刚      :

自己的db类。。想改下,把类的创建改写成放到xml里面,。。

之后自己的 common.db db = new common.db();

xml 里面写的是mdb类。。就把mdb类绑定到db对象上。。当然mdb是db的子类了。。

可惜今天没时间弄了。。书都在公司了。。厚厚。。找了个接口的代码测试了下,测试成功。。当然都是人家写好的了。。嘎嘎。。不过是自己再测试了一下。。

给出自己写的C# 接口的反射。。Vs2003编译成功。。

--------------------------------------------

public class mdb : Idb
 {
  public mdb()
  {
  }
  #region Idb 成员

  public void show()
  {
   // TODO:  添加 mdb.show 实现
   System.Web.HttpContext.Current.Response.Write("I am mdb");
  }

  #endregion
 }

 public class sql : Idb
 {
  public sql()
  {
  }
  #region Idb 成员

  public void show()
  {
   // TODO:  添加 sql.show 实现
   System.Web.HttpContext.Current.Response.Write("I am sql");
  }

  #endregion
 }

 public interface Idb
 {
  void show();
 }

 public class db
 {
  public db()
  {
  }
  public static Idb returndb()
  {
   string s = "Reflection.sql";//Reflection 是命名空间的名称。。自己起的
   Idb Idb = (Idb)System.Reflection.Assembly.Load("Reflection").CreateInstance(s);
   return Idb;
  }
 }

----------------------------------------------

页面代码:

Idb Idb = db.returndb();
Idb.show();

----------------------------------------------

显示结果:

I am sql

----------------------------------------------

参考:http://www.cnblogs.com/AXzhz/archive/2006/11/01/546493.html

其实这个还不是自己要的,想动态的反射一个对象。。回来再研究吧。。

要是谁知道怎么动态的反射对象的核心代码。。楼下的兄弟们希望多多帮忙啊。。

想要的结果就是 common.db db = new common.db() 我在xml里面指定用哪个类,就用那个类。。由于现在我写的程序都用的是这条语句。。所以就不想换了。。毕竟用的太多了。。不想改了。。期盼高手啊。。

 

楼主
  5个月前   彭成刚      :
刚才吃饭了啦。。嘎嘎。。记得以前别的文章写到 要用继承。。但是。。
就我自己的项目来说。。已经有很多都用到了
common.db db = new common.db();
这句了。。忽然想到了一个小招。。厚厚。。就是把接口写到db类里面不就解决了吗。。o(∩_∩)o...哈哈。。就上面的那个例子里面修改了一下db类。。
代码如下:
-------------------------------------
public class db
{
public Idb Idb;
public db()
{
string s = "Reflection.sql";
Idb = (Idb)System.Reflection.Assembly.Load("Reflection").CreateInstance(s);
}
public void show()
{
Idb.show();
}
}
----------------------------
页面调用代码:
db db = new db();
db.show();
----------------------------
页面显示:
I am sql
----------------------------
本人菜鸟一只。。刚学还没几天。。希望大家给于支持于辅导。。厚厚。。
思路:所有的方法都用接口来写,db类都调用接口。。(唯一的遗憾就是接口的方法会在db类里从新写一遍用来调用接口)。。之后写的mdb类和sql类都继承接口。。就KO了。。最后在xml里写mdb或sql就可以轻松调用各自的类了。。
而在前台都是写的db类。。这样自己用的就比较舒服了。。主要是自己用惯了。。555 。。 也不知道自己用的对不对。。o(∩_∩)o...忘与受教。。
回复  1楼 回到顶楼 
  5个月前   Nathan2008      :
厚厚哈哈,厉害
回复  2楼 回到顶楼 
  5个月前   shengnet      :
支持呀!~~~
回复  3楼 回到顶楼 
  5个月前   麒麟.NET      :
这不是简单工厂吗?
回复  4楼 回到顶楼 
  5个月前   彭成刚      :
不一样吧。。那个简单工厂怎么着和我这个可不一样吧。。
你看我的是 common.db db = new common.db();
是创建对象哦。。可是简单工厂可是延迟创建对象啊。。
他用继承返回一个对象。。那个对象是前面对象的基类啊。。比如
dongwu dw = common.CreateNiao();
明显和我这个不一样哦。。
不过我那个思想也是延迟到后面创建,,呵呵。。就是代码多了点。。但是好处也是有的啊。。就是现有的代码全部不用修改哦。。
回复  5楼 回到顶楼 
  5个月前   麒麟.NET      :
new db改成db.Create不就一样了吗?一个是在构造函数中,一个实在静态方法中,其实质是一样的
回复  6楼 回到顶楼 
  5个月前   彭成刚      :
不能改啊。。我的项目里面已经用了很多很多了。。数着也有好几百个了。。我可不想replace,万一出问题了。。还有也用惯了 new了。。暂时项目不大。。蓝的改了。。呵呵。。
回复  7楼 回到顶楼 
  5个月前   wenanry      :
感觉不出和工厂模式有什么区别?
回复  8楼 回到顶楼 
  1个月前   没有昵称      :
搜索一下依赖注入、控制反转。大把现成的框架。
回复  9楼 回到顶楼 
  3周前   笨→鸟(Bird)      :
可以用Castle或是Spring.net等类似的框架。
你的目的无非是要实现组件与服务 或是组见与组件之间的解耦吧。
建议用Castle,Spring.net一切皆配置 玩起不爽。
回复  10楼 回到顶楼 
  3周前   笨→鸟(Bird)      :
又走到这里来了。在补充点吧。
对于你上面的设计我个人感觉很不爽,就PetShop里的那中利用反射的方法吧,实际上这中设计还是很死板的,
public static Idb returndb()
{
string s = "Reflection.sql";//Reflection 是命名空间的名称。。自己起的
Idb Idb = (Idb)System.Reflection.Assembly.Load("Reflection").CreateInstance(s);
return Idb;
}
这样去设计,如果在一个系统里有许多的接口及实现类。那么你可以把关系配置在配置文件中通过反射来实现,事想,这样是不是每一个接口都需要定义一个方法来创建基于此接口返回此接口实现类的方法呢?

在PetShop里用到了泛型,这点我们完全可以使用泛型接口来处理掉为每一个接口定义一个方法去创建对象的缺陷。
namespace IDAL
{
///
/// 通用服务(便于在工厂中动态创建对象--相当于一个虚拟IOC容器)
///

///
public interface IDALCommon
{
///
/// 返回一个项集合
///

///
IList GetItem(string strSQL);
}
}
---------------------------------------------------------------
namespace DALFactory
{
public class Factory
{
public Factory()
{ }

///
/// 根据配置文件生成一个传入的对象,并将其转为IDAL.IDALCommon泛型接口
///

///
///
/// IUserInfo
public static IDAL.IDALCommon GetDAL(string assemblyName, string className)
{
return (IDAL.IDALCommon)Assembly.Load(assemblyName).CreateInstance(className);
}
}
}
------------------------------------------------------------
这样上面的方法就可以通用了,在调用的时候只需要传入程序集和相应的参数就可以了。就不必为每一个接口的创建工作去写一个方法来完成。
namespace BLL
{
public class Books:IDAL.IBooks
{
///
/// 构造方法
///

public Books()
{ }

private static readonly string DAL_NAME = ConfigurationManager.AppSettings["DAL"];
private static readonly string BOOKS_COMPONENT = ConfigurationManager.AppSettings["Books"];
private static readonly string SQL_STRING = ConfigurationManager.AppSettings["BooksSql"];

///
/// 返回一个泛型接口
///

///
public IList GetBooks()
{
string className = string.Format("{0}.{1}", DAL_NAME, BOOKS_COMPONENT);
IDALCommon user = DALFactory.Factory.GetDAL(DAL_NAME, className);

return user.GetItem(SQL_STRING);
}
}
}
回复  11楼 回到顶楼 

你还不是小组成员,加入小组以后才能发布新主题!
> 返回“设计模式”


其他话题

1 26752