【我出分,大家谈论】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.配置文件可以是任何类型,任何格式的文件,但是你的程序要能很方便的访问和改写里面的元数据,这就要求你有合理的数据存储和查询结构
如果元数据是:
中国----》湖北|||武汉:武昌
这样的格式,你认为你能很容易的访问他们吗?所以程序员们为了访问的方便就自己设计了很多容易读取的格式:比如早期的 以固定字符做分割的cvs文件,后来的ini文件,现在的xml文件
4.为了能更容易的访问和读写配置文件,除了需要程序员设计出合理的配置文件格式以外,聪明的,睿智的,偷懒的程序员们又自己设计了各种各样的能在自己的代码里方便读取的代码类,但是偷懒的程序员觉得,为啥不能有一些通用的,一劳永逸的方法呢?于是他们使用特性,把需要配置的东西标明出来,然后使用序列化,让序列化代码自己去生成配置文件,同时有可以反序列化成为原来的对象。这样不是方便了很多---------(在这里让我向那些充满创造性并且会偷懒的前辈们致敬)
[解决办法]