您仍然可以在OnStartup()
方法中配置容器,只要您在OnStartup()
调用之前不隐式或显式地从容器请求任何这些服务,它就不会给您带来任何问题。
Caliburn.Micro 没有Configure()
以任何特殊方式处理该方法。事实上,如果您不为GetInstance(), GetAllInstances() and BuildUp()
引导程序中的方法提供覆盖,即使您在方法中正确配置,Caliburn.Micro 也将无法使用在您的容器中注册的任何服务Configure()
。
编辑:我还想澄清一件事。由于您将在该OnStartup()
方法中提供额外的配置,因此您应该从中派生引导程序,BootstrapperBase
而不是Bootstrapper<TRootModel>
因为后者会自动为您显示您的主视图模型,并且因为该主视图模型可能会使用尚未注册的服务,它可能会导致一些问题,所以我们想控制它何时显示。无论如何,废话不多说,这是您可以使用的:
public class AppBootstrapper : BootstrapperBase
{
SimpleContainer container;
public AppBootstrapper()
{
Start();
}
protected override void Configure()
{
container = new SimpleContainer();
container.Singleton<IWindowManager, WindowManager>();
container.Singleton<IEventAggregator, EventAggregator>();
container.PerRequest<IShell, ShellViewModel>();
}
protected override object GetInstance(Type service, string key)
{
var instance = container.GetInstance(service, key);
if (instance != null)
return instance;
throw new InvalidOperationException("Could not locate any instances.");
}
protected override IEnumerable<object> GetAllInstances(Type service)
{
return container.GetAllInstances(service);
}
protected override void BuildUp(object instance)
{
container.BuildUp(instance);
}
protected override void OnStartup(object sender, System.Windows.StartupEventArgs e)
{
// ######################
// DO THOSE COMMAND LINE CONFIGURATIONS HERE AND EVERYTHING
// SHOULD BE JUST FINE.
// ######################
DisplayRootViewFor<IShell>();
}
}