使用命令行参数自定义容器配置

时间:2013-07-22 20:58:44

标签: .net wpf autofac caliburn.micro

我有一个使用Caliburn 1.5.2 e Autofac 3.0.2的.NET 4.0,WPF应用程序。

我想使用命令行参数来自定义IoC容器的构建。

问题是命令行参数仅在Appplication.OnStartuplink)可用,并且只有在Bootstrapper.Configure已被调用时才会出现。

我想这样做的原因是因为我在这个应用程序(usb设备通信,Web服务)中有一些服务,我希望能够用模拟实例替换它们。这些服务在注册后立即初始化(Autofac's AutoActivation extension),因此选择使用哪种类型的最佳时机是在容器中注册它。

我在考虑:

  • 将服务初始化延迟到应用程序的主视图模型。

  • 分两个阶段拆分容器配置逻辑,一个在Bootstrapper.Configure,另一个在Bootstrapper.OnStartup

主要的警告是:

  • viewmodel将依赖于服务来初始化它们。
  • 将容器配置分为两部分,我必须在依赖解析中寻找问题。
  • 我认为只在一个地方进行容器配置会更好。

我还考虑过寻找Main(string [] args)并在静态实例中缓存参数,但是这个代码是在WPF应用程序中自动生成的,并且干扰它似乎有点过于极端。

我想知道是否有人知道更好的方法。

2 个答案:

答案 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>