管理通过使用“设计器”属性产生的松散耦合的程序集引用

Posted

技术标签:

【中文标题】管理通过使用“设计器”属性产生的松散耦合的程序集引用【英文标题】:Managing loosely coupled assembly references incurred through usage of the 'Designer' attribute 【发布时间】:2011-06-19 14:26:19 【问题描述】:

我们构建了很多组件、WinForms、Workflow 活动等,我们经常使用的是“Designer”属性。 初始开发期间的一般做法是,Designer 属性与 [Designer(typeof(DesignerType))] 样式一起使用以使事情正常运行 - 然后,将其转换为 [Designer("AssemblyQualifiedTypeName")],这允许从组件的引用列表中删除设计器 DLL - 这消除了组件消费者必须将设计器 DLL 与他们的产品一起部署的需要。 这种将设计时和运行时代码拆分为两个单独的 DLL 的做法是常见做法,我也是这种做法的支持者。

负面影响是“程序集限定类型名称”将包括设计器 dll 的程序集版本,因此当版本增加时,必须在产品中执行“搜索和替换”以确保它们已更新对这位设计师的所有“松散参考”。

最后,我的问题: 任何人都可以推荐一个不依赖“搜索和替换”的最佳实践,它可以管理所有这些引用,以确保它们始终是最新的? 我们经常遇到懒惰的开发人员忘记更新引用字符串,从而导致新版本的组件链接到设计器 DLL 的先前版本 - 当然不会部署,因此失去了设计时支持。 也许是某种形式的编译指示、宏、构建脚本、魔法属性,我不知道,但必须有更好的方法来做到这一点。

有人吗? (谢谢)

【问题讨论】:

为什么要增加设计器的 [AssemblyVersion]?这没有任何意义,你不要部署它们。 嗨 Hans,我们正在构建开发者组件并将其作为 SDK 出售,因此我们将组件 DLL 和设计器 DLL 提供给我们的客户,他们使用这些组件来构建产品,他们(在转)只使用他们的产品部署组件。因为他们可能安装了两个或多个版本的 SDK,组件需要加载正确版本的设计器,因此,设计器 DLL 也需要进行版本控制。 【参考方案1】:

为什么不创建一个单独的设计器,在内部使用托管插件框架或 Activator.CreateInstance 之类的东西来挑选和展示设计器?使用这种技术,Designer 属性将永远不必更改......

【讨论】:

嗨,亚历克斯 - 我们如何做到这一点? “DesignerAttribute”由 Visual Studio 根设计器(即窗体设计器或 WF 活动设计器)读取。因此,DesignerAttribute 是一种必要的邪恶,并且(根据我的理解)没有办法介于 Visual Studio 和组件之间。 当 VS 或 WF 设计者看到你已将属性应用到一个类时,它实际上会创建该类的一个实例并使用它。您知道这一点是因为您编写的自定义设计器按预期工作。但是,您可以编写代码来根据某些配置设置动态创建类的实例,而不是显示 UI。除了 MAF 或 Activator.CreateInstance,您还可以使用 Spring.NET 或 Unity 之类的东西。 对不起,亚历克斯,我明白你在描述什么,但不知道如何实现这一点。 Visual Studio 创建了一个 DesignerAttribute '引用'的 Designer 实例(它必须是一个设计器),我无法控制它对它的作用......通常是在设计窗口中显示它。你能用伪代码解释一下你的意思吗?【参考方案2】:

像微软那样做。看看 Reflector 中的 AssemblyRef 类(System.Windows.Forms.dll)。

【讨论】:

以上是关于管理通过使用“设计器”属性产生的松散耦合的程序集引用的主要内容,如果未能解决你的问题,请参考以下文章

C# 未能找到类型或命名空间名称 "MyRectangle"(是不是缺少 using 指令或程序集引

ASP.Net MVC - 啥替换事件以支持松散耦合?

什么是 微服务

谈谈微服务设计中的API网关模式

松散耦合的依赖关系:如何?

学习Spring IoC