【问题标题】:How do I use automapper with System.AddIn?如何将 automapper 与 System.AddIn 一起使用?
【发布时间】:2015-06-19 07:42:21
【问题描述】:

在 System.AddIn(又名 MAF)管道适配器中,需要手动将值从一种 DTO 类型复制到另一种 - 从 HostView 类型到 Pipeline Contract 类型以及从 Pipeline Contract 类型到 AddIn 视图类型(然后返回再次)。这似乎是使用自动映射器的理想情况。

但是我不确定在 HostView 和 AddInView 适配器中使用和打包第 3 方程序集的正确方法,尤其是在单独的 AppDomain 中激活 AddIn 时。

我尝试了以下方法:

  • 将 automapper 的 nuget 引用添加到 AddIn 适配器项目并在其中创建映射配置文件。 (我对初始化配置文件的适配器使用了静态 ctor,因为 MAF 负责实例化适配器。)

  • 反直觉地,为了让管道定位并激活适配器支持的插件,我必须确保自动映射器 DLL 位于我的 Host 的 bin 目录中 - 具有实际适配器 DLL 旁边的“AddInAdapters”文件夹中的 automapper DLL 无效。

通过这种安排,我能够在我的开发盒上找到并激活插件(win 7)。但是完全相同的二进制文件在 Server2008R2 上不起作用。 (我知道,我知道:我无法控制开发或服务器操作系统的选择)

我们正在使用(和定位).Net 4.5.1 - 是的,它在桌面和服务器上。我们正在使用 automapper 2.2.1 - 不,它不在我的开发箱的 GAC 中

适配器使用的第 3 方程序集应位于何处(插件端和主机端)。尤其是在考虑 AppDomain 隔离时

为什么上述安排可以在 Windows 7 上运行,而不是 2008R2?

【问题讨论】:

    标签: c# .net automapper maf system.addin


    【解决方案1】:

    在主机端,它应该位于应用程序的根输出目录中。所有主机 dll 都加载到您的应用程序域中,程序集解析器将在您正在运行的程序集的位置查找 automapper dll。

    在插件方面,它应该位于插件适配器目录中。插件适配器和插件视图被加载到新的应用程序域中,并且需要它们自己的此 dll 副本。

    在管道中的任何位置使用第三方库时需要注意的一点是,它会使管道版本控制变得痛苦。如果您正在加载管道的多个版本以允许 V1 和 V2 插件仍然工作,如果它们依赖于程序集的不同版本,您可能会在协调这一点时遇到问题。如果您不关心管道版本控制,那么这不是问题。

    【讨论】:

    • 感谢您的回复。这有点乱:除了实际的适配器 DLL 之外,我到处都有 3rd 方 DLL 的副本(bin dir,addin dir),因为我不知道 AppDomain 隔离可能是什么。WRT 到管道版本控制,我来了认为只要契约和视图程序集是固定版本,那么我可以重建和重新部署适配器,而不需要重新部署主机或插件或契约/视图 DLL,但现在事实证明,如果适配器使用一个 DLL,我需要用适配器使用的 DLL 的副本污染主机 bin 目录和 addin 目录
    猜你喜欢
    • 2019-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-12
    • 1970-01-01
    • 2019-10-07
    • 1970-01-01
    相关资源
    最近更新 更多