我有一个使用Caliburn 1.5.2 e Autofac 3.0.2的.NET 4.0,WPF应用程序。
我想使用命令行参数来自定义IoC容器的构建。
问题是命令行参数仅在Appplication.OnStartup
(link)可用,并且只有在Bootstrapper.Configure
已被调用时才会出现。
我想这样做的原因是因为我在这个应用程序(usb设备通信,Web服务)中有一些服务,我希望能够用模拟实例替换它们。这些服务在注册后立即初始化(Autofac's AutoActivation extension),因此选择使用哪种类型的最佳时机是在容器中注册它。
我在考虑:
将服务初始化延迟到应用程序的主视图模型。
分两个阶段拆分容器配置逻辑,一个在Bootstrapper.Configure
,另一个在Bootstrapper.OnStartup
。
主要的警告是:
我还考虑过寻找Main(string [] args)并在静态实例中缓存参数,但是这个代码是在WPF应用程序中自动生成的,并且干扰它似乎有点过于极端。
我想知道是否有人知道更好的方法。
答案 0 :(得分:2)
Environment.GetCommandLineArgs()
我只是从Bootstrapper.Configure()
调用它并检查命令行开关,这很简单。
答案 1 :(得分:1)
您仍然可以使用OnStartup()
方法配置容器,只要您在OnStartup()
之前未隐式或明确地请求容器中的任何服务,就不会对您造成任何问题。被叫。
Caliburn.Micro不会以任何特殊方式处理Configure()
方法。实际上,如果您没有为引导程序中的GetInstance(), GetAllInstances() and BuildUp()
方法提供覆盖,则Caliburn.Micro将无法使用您的容器中注册的任何服务,即使您在{{1}中正确配置它也是如此。方法。
编辑:还有一件事我想澄清一下。由于您将在Configure()
方法中提供其他配置,因此您应该从OnStartup()
而不是BootstrapperBase
派生您的引导程序,因为后者会自动为您显示主视图模型,因为主视图模型可能会使用尚未注册的服务,这可能会导致一些问题,因此我们希望控制它何时显示。无论如何,足够的等等,这是你可以使用的:
Bootstrapper<TRootModel>