我有一个场景,我想在容器中注册一个组件的单个实例,但不幸的是它不能在应用程序启动时创建。 该组件只能被实例化,传递一些对象,这些对象仅在应用程序生命周期中稍后提供(但它们不是其他IoC注册服务,但是)[请参见下面的注释]。在初始配置后在IoC容器中注册
- 处于IoC容器注册部件后的初始配置(在应用程序启动时运行)一种不好的做法?
- 如何在不直接引用容器的情况下完成它?我应该抽象一个注册服务吗?
- 有更好的方法来支持这种情况?
注:关于实际情况
我想放在容器与UI控件的特定实例初始化成分(这基本上是一个适配器),所以我不得不手动创建组件实例并将其注册到容器中。
我会在应用程序启动时做到这一点,但不幸的是我没有可用的UI控件实例(我也不能自己创建它)。
即使在以后,我也无法从其他组件的表面到达UI控件实例,而不知道它们的具体类。
因此,我认为我可以将适配器注册的责任放入拥有UI控件的类中。
我的初步方案:
public interface IDockManager { ... }
public class AcmeDockManagerAdapter : IDockManager {
public AcmeDockManager(DockControl control) { ... }
...
}
public class ShellViewModel { ... }
public class ShellView : Window {
internal DockControl theDockControl;
}
public class AnotherViewModel {
AnotherViewModel(IDockManager dockManager) { ... }
}
我unconfortable与解决方案:
public class ShellView : Window {
internal DockControl theDockControl;
public ShellView() {
InitializeComponents();
var dockManager = new AcmeDockManagerAdapter(theDockControl);
//registration in the container
}
}
这是一个非常优雅的解决方案。然而,我的问题与组件实例的成本无关,而是与某些构造器参数的可用性有关。推迟实际的实例化要求至少懒惰的包装器知道如何检索所需的参数,当它最终到达创建实例时。 我应该更详细地解释我的情况,也许(我将要这样做)。谢谢你的帮助。 – 2010-12-18 09:29:01
对不起,但问题与视图和虚拟机之间的连线没有关系(这已经到位)。我只是添加了实际的类,希望能够澄清上下文。 我的意图是抽象对接部分并将其接口从ShellVM中分离出来,确切目的是允许动态添加。 我希望将对接服务放在容器中以简化依赖注入,但我可以肯定从ShellVM(它已经在容器中注册为单例)访问它。 – 2010-12-18 19:27:19