日期:2014-05-20  浏览次数:20483 次

【我出分,大家谈论】web.config、序列化、反射、特性和强类型之间有些什么关系
现在脑袋像浆糊一样了。

第一搞不懂的就是web.config是个什么东西,知道它能配置,但是,为什么在它里面写一下xml就可以控制程序了呢?
猜测是不是和xml的序列化有关?msdn上说连.cs文件都是被XmlSerilize成.dll文件的,难道.net里编译和序列化还有关系?
可以自定义配置,配置过程就包括两部分:在xml里要写一段,还要自己声明一些继承自Configuration的类,类里面的属性还要加上特性……xml和类有关系么?应该有,是吧?web.config里的东西(每个节点)实际上是一些类,节点的属性就是类的属性?
这里面还要牵扯到反射吧?所谓的“映射”,经常看到的一个词,究竟是什么东西?
还有就是强类型,比如DataSet,他是如何做到“强”类型的呢,他从数据库取出来的,不过是一些字段值而已,难道也是用的反射?

感觉问题比较多,因为我的思路也很乱,从一开始学asp.net这些问题就没看到过解释!异常烦躁。

可能不是三言两语能说得完的,有兴趣的帮顶一下!能提供资料的更好,先谢了。

特别有兴趣的,还可以加QQ群:34263285



------解决方案--------------------
Web.config 文件是一个XML文本文件,它用来储存 ASP.NET Web 应用程序的配置信息(如最常用的设置ASP.NET Web 应用程序的身份验证方式),它可以出现在应用程序的每一个目录中。当你通过.NET新建一个Web应用程序后,默认情况下会在根目录自动创建一个默认的Web.config文件,包括默认的配置设置,所有的子目录都继承它的配置设置。如果你想修改子目录的配置设置,你可以在该子目录下新建一个Web.config文件。它可以提供除从父目录继承的配置信息以外的配置信息,也可以重写或修改父目录中定义的设置 更多。。。。。。。

XmlSerilize 是序列化所需要用到的类,应用程序在底层传输数据都用的是XML传输的 通过序列化可以将对象数据集数组等序列化为 XML

反射Reflection 可以将编译好的dll文件里面的方法 属性等显示出来方便你在引用的时候调用方法
------解决方案--------------------
通过反射可以得到类的属性、类型、值等信息:
using System.Reflection;
private void Form1_Load(object sender, EventArgs e)
{
UserModel m = Test<UserModel>();
m.ID = 123;
m.Name = "gcy";
Type t = m.GetType();
PropertyInfo[] pts = t.GetProperties();
for (int i = 0; i < pts.Length; i++)
{
PropertyInfo pi = pts[i];
MessageBox.Show(pi.Name);
MessageBox.Show(pi.PropertyType.ToString());
MessageBox.Show(pi.GetValue(m, null).ToString());
}
}

private t Test<t>()
{
t obj = Activator.CreateInstance<t>();
return obj;
//ConstructorInfo ct = t.GetConstructor(System.Type.EmptyTypes);
//return ct.Invoke(null);
}

------解决方案--------------------
如何由XSD自动生成XML和实体类
采用反射技术和XML的通用实体类
------解决方案--------------------
web.config就是配置文件,.net规定了就是用这个文件做为Web程序的配置,只不过这个文件的格式是 xml 的,asp.net 自身的配置都是读取这个文件,所以这个文件内容变化之后,程序也会发生变化。这个文件如果做成其他格式,例如文本、ini之类的都是可以的,程序的行为和 xml 没有任何关系。

------解决方案--------------------
举个简单的例子吧。

假设我们用工厂模式写这么一段东西:

interface DBOperation
{
//...
};

class AccessOp : DBOperation
{
//...
};

class SqlServerOp : DBOperation
{
//...
}

使用的时候

DBOperation db = new AccessOp();
或者
DBOperation db = new SqlServerOp();

如果配置文件里面能够读到用于区分这两者的字符串:
string dbType = ...; // 读配置文件

那么就可以根据 dbType 来选择上面的类了
撇开 .Net 的反射,可以
if (dbType == "SqlServerOp")
{
DBOperation db = new SqlServerOp();
}
else if (dbType == "AccessOp")
{
DBOperation db = new AccessOp();
}
else
{
//Error
}
配置文件中的内容就达到了“控制程序”的目的。

进而如果把反射用上去,上面那段程序就可以从 10 来行缩为一行,类似:

DBOperation db = Activator.CreateInstance(Type.GetType(dbType));


其实个人觉得 web.config 充其量也只是个配置文件而已,从实质上来说和以往的 ini、注册表项等都没什么两样
但是因为配置项比较多,反射机制也应用得淋漓尽致,所以显得复杂了。对于这种复杂的配置文件,个人的观点是不看好。但是我们没有不看好的权利。


------解决方案--------------------
1.web.cofig是配置文件。配置文件的意思不用我多说,就是说系统运行需要的元数据,并不直接硬编码里,而是写在一个文本里,这样的好处是显而易见滴!你可以动态的配置元数据,而不用重新编译就能更改程序运行的效果。
2.配置文件不一定是web.config,他可以是任何类型的文件,比如xml,txt,ini,cvs,dat,mdb只要你能很方便的读写和修改他们
3.配置文件可以是任何类型,任何格式的文件,但是你的程序要能很方便的访问和改写里面的元数据,这就要求你有合理的数据存储和查询结构