gpt4 book ai didi

c# - 处理 Caliburn Micro 的静态 IoC

转载 作者:行者123 更新时间:2023-11-30 20:54:52 27 4
gpt4 key购买 nike

我需要在基于 Prism 的容器中托管多个模块(全部使用 Caliburn Micro 完成)。在容器内,可以创建来自同一模块的多个 View (示例:可以从计算器模块创建科学和金融计算器)。

我将 Unity 用于 DI,因此覆盖了所有模块中的 Caliburn Micro Bootstrap 以从统一容器解析。

作为CM's IoC class 是一个静态类,最后一个注册它的依赖项的模块会覆盖 ( previous one ) - 请参阅 IoC.GetInstance = GetInstance 行。

我非常喜欢 Sniffer 建议的想法,但每个模块都会创建自己的子容器,因此它不适用于我的场景。

最佳答案

我会提出一个我认为可行的解决方案。默认情况下,CM 分配 IoC.GetInstance()和所有其他Func<>与会代表 BootstrapperBase就像这样:

IoC.GetInstance = this.GetInstance

在哪里this.GetInstance只是BootstrapperBase中的一个方法这是虚拟且空的,因此您可以在自己的派生 Bootstrap 中覆盖它。

我尝试的解决方案:存储对已在 IoC.GetInstance 中注册的内容的引用并在你的新 GetInstance 中调用它覆盖,并对其他两个静态执行此操作 Func<>IoC .

在构造函数中或 Configure() Bootstrap 的方法,为那些静态 Func<> 提供 Hook 与会代表 IoC相互包裹,像这样:

public class CalculatorBootstrapper : BootstrapperBase {

private Func<Type, string, object> _previousGet;

public override void Configure() {
_previousGet = IoC.GetInstance; // store reference to whatever was stored previously
IoC.GetInstance = this.GetInstance;
}

public override Object GetInstance(Type type, string key) {
var result = null;
if (_previousGet != null)
result = _previousGet(type, key);
if (result == null) {
// Try to use the local container here

}
return result;
}
}

关于c# - 处理 Caliburn Micro 的静态 IoC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18743899/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com