当前位置: 首页 > 互联网 > 正文

.NET访问修饰符及资源文件

昨天,工作中有一个已编译好的动态链接库,本想直接使用,但我想采用不同的数据库配置方法。原先库中封闭默认的是读取WebConfig中配置的数据库连接字符串。而我本人想采用客户端方式的数据库连接字符串。动态链接库是编译好的,在对象浏览器中也只能查看到一些公开的方法,无法看到具体的定义,因此没什么更多参考的价值。

于是,我就使用了Reflector反编译工具,看了一下公开方法的具体定义,发现有一个公开的可创建数据库的方法:

[sourcecode language=”csharp”]
public static IDatabase CreateDatabase(string name, string providerName, string connectionString)
[/sourcecode]

在欣喜之时,果断调用此方法来创建Database。运行程序发现报错“没有找到***数据库配置”,也就是说无法访问我设定数据库。为啥这个公用的接口会报出这样的错误呢?再细剖了里的代码及相关的调用:

[sourcecode language=”csharp”]
public static IDatabase CreateDatabase(string name, string providerName, string connectionString)
{
IDatabase database = GetDatabase(name);
if (GetDatabase(name) == null)
{
IDatabase database2 = new Database(name, providerName, connectionString);
DatabaseConfiguration.AddDatabase(name.ToUpper(), database2);
return database2;
}
return database;
}

public static IDatabase GetDatabase(string name)
{
IDatabase database = DatabaseConfiguration.GetDatabase(name.ToUpper());
if (database == null)
{
throw new NullReferenceException(string.Format("没有找到名称为{0}的数据库配置!", name));
}
return database;
}
[/sourcecode]

在CreateDatabase的方法定义中,调用了GetDatabase方法,我们在GetDatabase方法定义中可以看到,如果数据库name之前没有定义的话,就会抛出异常。这就是问题的症结所在。也就是说,CreateDatabase方法永远无法创建一个新的不存在的数据库,而如果原先存在数据库也根本不需要CreateDatabase方法返回,直接用GetDatabase方法返回数据库就行。因些,我认为GetDatabase方法本不应该抛出异常,只要返回null就可以,让在调用的方法内部去判断是否获取到IDatabase对象;或者,将CreateDatabase方法重写,重写判断对应名称(name)的数据库IDatabase对象是否存在的方法,然后根据是否存在,从而确定直接返回结果还是新建IDatatbase对象再返回。无奈,此时没有找到源代码。

那就向上溯源吧,看DatabaseConfiguration中有什么方法我可以直接创建数据库的。无奈这个静态类对象是internal访问类型的。internal指示该类只能在链接库内部使用,对外部应用程序或是库是透明的,它的方法是无法直接调用的。心中暗骂可恶。

看来不得不求助链接库的源代码了。在将其从原先的VS2005开发环境,升级到VS2010开发环境时,发现一个问题就是资源文件Resource.resx的代码文件Resources.Designer.cs会被重写,代码的名称空间也被重写。造成类文件中要使用的这个资源文件的引用都发生未找到“***.Properties”命名空间的错误。因此,在升级的时候,不允许IDE自动修改资源文件,也就是不让IDE修改你的任何代码,这样代码才能正确的编译。

打开源代码,便将GetDatabase方法中的为空抛出异常的代码果断隐去。编译通过,再在新项目中引用刚编译过的链接库,调用CreateDatabase方法创建我自己定义的数据库名称及连接字符串,发现数据库能够成功访问。

通过上面的折腾,我得到了以下几点感触:

1.封装库要有更大的适用性时,需要考虑多种情况,在不改变主体功能的情况下,不限定应用的范围,比如:既要考虑Web程序,也考虑应用程序。也可能很多时候需要用时才知道。

2.要考虑代码内部的联系,不造成前后之矛盾,公开的方法要有其合理性,准确性,适用性。公开的方法同样要有容错性,我们可以约定在调用的方法中检测错误,而不是成为调用时障碍。

3.多分析查看源代码能帮助我们了解别人代码的设计准则与规范,反过来会促进我们在今后编写代码时有更多的思考,让代码写得更加规范和易用,更容易扩展。或许在重构时我们更容易整理思路,写出更精炼的代码。

人无完人,代码是人写出来的,同样也没有最好的代码。也只有我们在平常的工作学习中,多写些规范的代码,多全盘考虑,多多重构,多多总结经验,只有这样我们才能将代码写的越来越准确,越来越精彩。

本文固定链接: http://www.byhard.com/?p=946 | 海纳百川

该日志由 byhard 于2013年04月02日发表在 互联网 分类下,
原创文章转载请注明: .NET访问修饰符及资源文件 | 海纳百川
关键字:

.NET访问修饰符及资源文件:目前有11 条留言

  1. 呵呵 不错,欢迎来访

    2013-04-02 11:49
    • byhard:

      谢谢支持。

      2013-04-03 09:43
  2. 很清爽,感觉不错!欢迎来访!

    2013-04-02 16:04
    • byhard:

      是吗,看的久了,感觉也没那么简洁了啊。现在还继续用着,等哪天想换了就换个。

      2013-04-03 09:43
  3. 多多总结经验,只有这样我们才能将代码写的越来越准确,越来越精彩。

    2013-04-08 14:40
    • byhard:

      你说呢?

      2013-04-11 09:59
  4. 不是程序员 对这些不懂

    2013-04-27 10:22
  5. 师傅说,看了不回,木有jj。马克下文章,慢慢看;忠实粉丝,期待更新。我是一鸣,回访一下吧。。。

    2013-05-02 17:01
    • byhard:

      你师傅是对的。

      2013-05-02 17:27
  6. 沙发
    诱惑看护:

    楼主,请原谅我的自私!我知道无论用多么华丽的辞藻来形容楼主您帖子的精彩程度都是不够的,都是虚伪的,所以我只想说一句:您的帖子太好看了!我愿意一辈子的看下去!

    2013-05-09 11:44
    • byhard:

      真是虚伪的没话说啊。

      2013-05-09 16:32