如何使用Caliburn Micro的IOC实例化具有构造函数参数的视图模型?

时间:2014-08-31 01:19:11

标签: inversion-of-control ioc-container caliburn.micro

在我的bootstrapper文件中,我想显示我的视图模型的根视图,ONH836ViewModel。此视图模型派生自BaseViewModel,它具有一个包含五个参数的构造函数:

public BaseViewModel(IExportedDataMonitor monitor, IGasLabWorklistService worklistService, IRawDataConduit rawDataConduit,
            ISettingService settingService, IDataReportingService dataReportingService)

以下是引导程序的相关代码:

class AppInitializer : BootstrapperBase
    {
        SimpleContainer container = new SimpleContainer();

        public AppInitializer()
        {
            Start();
        }
        protected override void OnStartup(object sender, System.Windows.StartupEventArgs e)
        {
            base.OnStartup(sender, e);
            DisplayRootViewFor<ONH836ViewModel>();
        }

        protected override void Configure()
        {           
            container.RegisterSingleton(typeof(IExportedDataMonitor), null, typeof(FakeExportedDataMonitor));
            container.RegisterSingleton(typeof(IGasLabWorklistService), null, typeof(FakeGasLabWorklistService));
            container.RegisterSingleton(typeof(IRawDataConduit), null, typeof(FakeRawDataConduit));
            container.RegisterSingleton(typeof(ISettingService), null, typeof(FakeSettingService));
            container.RegisterSingleton(typeof(IDataReportingService), null, typeof(FakeDataReportingService));

            container.RegisterSingleton(typeof(BaseViewModel), null, typeof(ONH836ViewModel));

        }

OnStartup方法在DisplayRootView行上抛出NullReferenceException。我认为这是因为我在Configure方法中做错了。有人可以识别并纠正我的错误吗?

1 个答案:

答案 0 :(得分:0)

假设v2.xx为CM,则start()应为Initialize()。请参考以下代码为自己节省一些打字。

container.Singleton<ONH836ViewModel>();

对于你的接口,我建议

container.Instance<IExportedDataMonitor>(new FakeExportDataMonitor());

他们可以被链接......

container.Instance<IGasLabWorkListService>(new FakeGasLabWorklistService()) .Instance<IRawDataConduit>(new FakeRawDataConduit()) .Instance<ISettingService>(new FakeSettingService());

NullReference的原因很可能是由于在构造函数中没有调用Initialize()而导致从未调用Configure。