我有一个带有RDLC报告的ASP.NET应用程序。魔术发生在我在主ASP应用程序中引用的单独程序集中。我在这个程序集中有一些静态数据,我想在RDLC报告系统对它们进行序列化和反序列化之后在我的对象中引用它。
我发现在RDLC报告运行期间重新初始化静态字段,也许RDLC正在加载程序集的新副本。因此,我的对象在静态数据上命中空引用,我期待之前设置的数据。
这里发生了什么?有没有办法确保只加载一个程序集的一个副本?
答案 0 :(得分:1)
原因似乎是RDLC ReportViewer在一个单独的AppDomain中运行,因此不与主应用程序共享内存。
我花了几个小时重构我的数据库类,所以它们可以序列化然后反序列化,所有这些都是为了RDLC的好处,但却发现在反序列化后他们无法分配正确的数据库提供程序,因为那是坐在RDLC无法看到的静态类中,因为它在不同的AppDomain中运行。
这是我第一次真正听说过AppDomains,所以我无法搜索这些能够解决问题的相关问题:
我找到了强制报告在当前AppDomain中运行的提示,这已过时且需要启用CAS,但我无法在项目中使用它(我只试了一会儿):
最后,我已经确定正确的解决方案不是通过代码体操来诱骗ReportViewer处理我的数据 - 而是为报告提供一个简单的POCO,它可以轻松地序列化和反序列化,并且没有复杂的依赖关系。
这是DB对象应该简单且易于序列化的一个很好的理由,并且业务逻辑应该位于DB对象之上的单独对象/包装器中。我的这些复杂的“上帝对象”现在已经困扰我一段时间了!