我在这里遇到了一个真正令人头疼的问题……它似乎是 ASP.NET 中更令人沮丧的话题之一。
我有一个程序集,它实现了很多自定义的 Linq 东西,它的核心是零网络功能。我有一个额外的程序集,它使用特定于 Web 的行为扩展了这个程序集。
Web 特定行为带有在 ASCX 模板化的用户控件中标记的几个用户控件。
我无法很好地完成此程序集,以便重新部署以用于其他应用程序。让我来看看我到目前为止所尝试的:
- 使用构建事件将 ASCX 文件复制到使用 Web 应用程序;远非理想,而且是一场部署噩梦。
- 实现了一个自定义 VirtualPathProvider 并将 ASCX 模板作为嵌入式资源嵌入到程序集中。不幸的是,当在消费应用程序中使用 Register 指令时,它会将设计器声明创建为 UserControl,我需要在其中声明实际控件类型;不可预见的(通常)和不受欢迎的。
- 创建了一个 Web 部署项目来编译 UserControls,但是编译的用户控件然后成为另一个程序集的一部分,并且不再来自我的 Web 程序集中的类定义——程序集需要根据请求上下文实例化它们。
所以第 1 号只是废话,第 2 号并没有给我我想要的类型支持,第 3 号我想我将提出一个合理的解决方案:
- 将所有非控制类集中到
App_Code
文件夹中,准备一个工厂类,该类将使用反射构造所需控制类型的对象,并期望被反射的类型将出现在部署输出中(希望通过ClassName
属性的存在来保证在Control
指令中)。
还有将 ASCX 控件重写为自定义控件的另一种选择,但目前没有资源来考虑它,而且我们没有这样做的专业知识,它们作为 UserControls 可以正常工作。
我是否遗漏了一些明显的东西,可能更简单的东西,或者这只是故意困难?我读过关于 ASP.NET 编译过程的故事,在我穿越这个主题的过程中,它的设计非常不幸。