- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有时使用 Caliburn.Micro创建应用程序。
使用最简单的 BootStrapper,我可以像这样使用 IoC 容器 (SimpleContainer):
private SimpleContainer _container = new SimpleContainer();
protected override object GetInstance(Type serviceType, string key) {
return _container.GetInstance(serviceType, key);
}
protected override IEnumerable<object> GetAllInstances(Type serviceType) {
return _container.GetAllInstances(serviceType);
}
protected override void BuildUp(object instance) {
_container.BuildUp(instance);
}
所以在 Configure
我可以像这样添加和注册我的 ViewModels 的方法:
container.PerRequest<MyMainViewModel>();
我的 ViewModel 的构造函数可以有一个参数,该参数在请求时由 IoC 容器注入(inject):
public MyMainViewModel(IWindowManager windowManager)
{
//do the init
}
当我调用 DisplayRootViewFor<MyMainViewModel>()
时,它按预期工作
但是,如果我打算创建更多逻辑并使用 Conductor,会发生什么? ?
在示例中,作者为了“方便”使用了一个简单的、无 IoC 的实现:
In order to keep this sample as simple as possible, I’m not even using an IoC container with the Bootstrapper. Let’s look at the ShellViewModel first. It inherits from Conductor and is implemented as follows:
public class ShellViewModel : Conductor<object> {
public ShellViewModel() {
ShowPageOne();
}
public void ShowPageOne() {
ActivateItem(new PageOneViewModel());
}
public void ShowPageTwo() {
ActivateItem(new PageTwoViewModel());
}
}
因此他们实例化 ViewModels,而不是从 IoC 容器请求实例。
在这种情况下,依赖注入(inject)的正确用法是什么?
我有另一个 ViewModel,它有这样的构造函数:
public MySecondViewModel(MyParamClass input)
{
//do the work
}
我应该这样修改代码吗:
在Configure
方法:
simpleContainer.PerRequest<MyParamClass>(); //How could it be different every time?
在指挥中:
public void ShowPageOne()
{
ActivateItem(IoC.Get<MySecondViewModel>());
}
另外,这是否允许或违反了 DI 的规则:
protected override object GetInstance(Type serviceType, string key)
{
if(serviceType==typeof(MySecondViewModel))
return new MySecondViewModel(new MyParamClass(2));
return _container.GetInstance(serviceType, key);
}
我可以看到使用 DI,ViewModels 应该由 IoC 容器提供,而不是手动创建(更不用说所需的参数 - 它在容器内)。
那么,您能给出一些提示,说明如何使用导体实现 IoC 模式吗?
最佳答案
最简单和最直接的方法是遵循 The Explicit Dependency Principle
假设
public MySecondViewModel(MyParamClass input) {
//do the work
}
并且它和它的依赖项在容器中注册,
simpleContainer.PerRequest<MyParamClass>();
simpleContainer.PerRequest<MySecondViewModel>();
MainViewModel
conductor 可以依赖于一个委托(delegate)(工厂),在需要时可以用来解决依赖关系。
public class MainViewModel : Conductor<object> {
//...
private readonly Func<MySecondViewModel> mySecondViewModelFactory;
public MyMainViewModel(IWindowManager windowManager, Func<MySecondViewModel> mySecondViewModelFactory) {
this.mySecondViewModelFactory = mySecondViewModelFactory;
//...do the init
}
public void ShowPageOne() {
var item = mySecondViewModelFactory(); //invoke factory
ActivateItem(item);
}
}
虽然没有正确记录,SimpleContainer
允许以 Func<TDependency>
的形式注入(inject)工厂代表 ( Source Code )用于注入(inject)依赖项的延迟解析/实例化。您可以利用该功能仅在实际需要时才解决您的依赖关系。
关于c# - 如何在 Caliburn.Micro 中使用 Conductor 的依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36899727/
我是一名优秀的程序员,十分优秀!