概述
在Caliburn.Micro中,我们一般在引导程序中实例化SimpleContainer,然后在Configure中去注入我们的实例,那如果我不想在一开始就注入所有实例,我想在其他类模块去实现动态注入,怎么去实现呢?这节就这个场景通过实例展开讲解.
实例
首先是继承引导程序类并重写我们实现IOC容器需要用到的几个方法.
public class HelloBootstrapper : BootstrapperBase
{
public HelloBootstrapper()
{
Initialize();
}
protected override void OnStartup(object sender, StartupEventArgs e)
{
//DisplayRootViewFor<MainWindowViewModel>();
DisplayRootViewFor<ILogin>();
}
private SimpleContainer container;
protected override void Configure()
{
container = new SimpleContainer();
container.Singleton<SimpleContainer>();
}
protected override object GetInstance(Type service, string key)
{
return container.GetInstance(service, key);
}
protected override IEnumerable<object> GetAllInstances(Type service)
{
return container.GetAllInstances(service);
}
protected override void BuildUp(object instance)
{
container.BuildUp(instance);
}
#region
protected override IEnumerable<Assembly> SelectAssemblies()
{
return new[] { Assembly.GetExecutingAssembly() };
}
#endregion
}
在这里我们注入 容器本身
container.Singleton<SimpleContainer>();
在我们需要注入实例的获取ioc容器:
var subContainer = IoC.Get<SimpleContainer>();
然后通过Singleton去注入实例,CreateChildContainer方法可以在容器中生成子容器
subContainer.Singleton<IViewModel, ShellViewModel>();
subContainer.Singleton<IViewModel, EventAggregatorViewModel>();
var subsubContainer = subContainer.CreateChildContainer();
subsubContainer.Singleton<IViewModel, ShellViewModel>();
subsubContainer.Singleton<IViewModel, EventAggregatorViewModel>();
通过GetAllInstances可以获取注入的所有实例。
注入实例代码如下:
public void IocTest1()
{
subContainer.Singleton<IViewModel, ShellViewModel>();
subContainer.Singleton<IViewModel, EventAggregatorViewModel>();
var subsubContainer = subContainer.CreateChildContainer();
subsubContainer.Singleton<IViewModel, ShellViewModel>();
subsubContainer.Singleton<IViewModel, EventAggregatorViewModel>();
}
public void IocTest2()
{
var count = subContainer.GetAllInstances<IViewModel>().Count();
MessageBox.Show($"总共实例数量:{count}");
var shellVM = subContainer.GetAllInstances<IViewModel>().
FirstOrDefault(vm => vm.GetType() == typeof(ShellViewModel));
((ShellViewModel)shellVM).AddData();
}
public void IocTest3()
{
var shellVM = IoC.Get<SimpleContainer>().GetAllInstances<IViewModel>().
FirstOrDefault(vm => vm.GetType() == typeof(ShellViewModel));
((ShellViewModel)shellVM).ShowNewWindow();
}
运行演示: