如果我使用托管插件框架 (System.AddIn) 并将其设置为使用单独的 AppDomain,我是否可以使用位于主要/默认 AppDomain 中的集中式 IoC 容器?IoC 容器能否跨 AppDomain 解析?
1 回答
我将通过忽略等式的 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 继承服务之外的任何事情,我肯定会看到这使事情变得复杂。