如果我使用托管加载项框架 (System.AddIn) 并将其设置为使用单独的 AppDomain,我可以使用主要/默认 AppDomain 中的集中式 IoC 容器吗? IoC 容器能否跨 AppDomain 解析?
最佳答案
我将通过忽略等式的 MAF 部分并专注于 AppDomain 问题来解决这个问题。 IoC 容器理论上可以执行您描述的操作,假设 IoC 入口点继承自 MarshalByRefObject 或由一个类包装,而该类又继承自 MarshalByRefObject。有了 29K+ 的代表分数,我相信您知道这一点,但是:
1) 从 MarshalByRefObject 继承的对象可以通过代理跨 AppDomain 边界访问(也就是说,所有调用都跨应用程序域边界编码到对象)。
2) 可序列化的对象可以通过序列化跨AppDomain边界传递,也就是说,您可以在另一个AppDomain中获得它们的另一个副本。
出于多种原因,您不希望序列化整个 IoC 容器并将其传送到 AppDomain 边界。首先,这样做的开销将是巨大的,其次,在 IoC 容器后面可能有很多管道是不可序列化的。因此,唯一可行的方法是:
1) IoC 容器本身是 MarshalByRef,或者被这样包裹
和
2) 您从 IoC 容器中获取的对象都已正确设置以供跨域使用(可序列化或 MBR 继承)。
如果以上两种情况都成立,那么理论上您可以从其他 AppDomains 使用托管在主 AppDomain 中的 IoC 容器。您可能会通过定义特定于 IoC 容器的 Resolve 方法(或您使用的 IoC 工具中的任何等效方法)的 MAF 主机适配器来执行此操作。
请记住,许多 IoC 功能(尤其是 AOP)是使用跨应用域通信也使用的相同代理 API 实现的。如果您尝试将 IoC 容器用于基本的可序列化结构和 MBR 继承服务以外的任何东西,我肯定会看到这会使事情复杂化。
关于.net - IoC 和托管加载项框架 (System.AddIn) 能否与隔离的 AppDomain 一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5091383/