3

如果我使用托管插件框架 (System.AddIn) 并将其设置为使用单独的 AppDomain,我是否可以使用位于主要/默认 AppDomain 中的集中式 IoC 容器?IoC 容器能否跨 AppDomain 解析?

4

1 回答 1

4

我将通过忽略等式的 MAF 部分并专注于 AppDomain 问题来解决这个问题。假设 IoC 入口点继承自 MarshalByRefObject 或由一个类包装,该类又继承自 MarshalByRefObject ,理论上 IoC 容器可以执行您所描述的操作。凭借 29K+ 的代表分数,我相信您知道这一点,但是:

1) 从 MarshalByRefObject 继承的对象可以通过代理跨 AppDomain 边界访问(也就是说,所有调用都跨 appdomain 边界编组到对象)。

2) 可序列化的对象可以通过序列化跨AppDomain边界传递,即在另一个AppDomain中可以得到它们的另一个副本。

出于多种原因,您不希望序列化整个 IoC 容器并将其传送到 AppDomain 边界。首先,这样做的开销将是巨大的,其次,在不可序列化的 IoC 容器后面可能有很多管道。因此,唯一可行的方法是:

1) IoC 容器本身是 MarshalByRef,或者被这样的容器包裹

2)您从 IoC 容器中获取的对象都已正确设置为跨域使用(可序列化或 MBR 继承)。

如果以上两个都成立,那么理论上您可以从其他 AppDomain 使用托管在主 AppDomain 中的 IoC 容器。您可能会通过定义特定于 IoC 容器的 Resolve 方法(或您使用的 IoC 工具中的任何等价物)的 MAF 主机适配器来做到这一点。

请记住,许多 IoC 功能(尤其是 AOP)是使用跨应用程序域通信也使用的相同代理 API 实现的。如果您尝试将 IoC 容器用于基本可序列化结构和 MBR 继承服务之外的任何事情,我肯定会看到这使事情变得复杂。

于 2011-05-04T03:22:58.210 回答