使用简单注入器替换ReactiveUI中的Splat

时间:2017-04-02 20:02:36

标签: c# inversion-of-control simple-injector reactiveui splat

我正在尝试使用Simple Injector替换ReactiveUI中的Splat。我正在使用SI的包插件。这是我的配置:

    public void RegisterServices(Container container)
    {
        // I also registered other stuff in here with container.Register()
        // but this code has been removed in the question.
        Locator.Current = new FuncDependencyResolver((service, contract) =>
        {
            if (contract != null) return container.GetAllInstances(service);
            var items = container.GetAllInstances(service);
            var list = items.ToList();
            return list;
        },
        (factory, service, contract) =>
        {
            container.AppendToCollection(service, Lifestyle.Transient.CreateRegistration(service,   container));
        });
    }

这是我在视图的构造函数中添加的内容:

// Bind code inside View.
this.Bind(ViewModel, vm => vm.OutputDirectory, v => v.comboBoxAdvOutputFolder.Text);

只要我在项目中使用Bind,就会抛出异常:“Project1.Windows.dll中发生了'System.TypeInitializationException'类型的异常,但未在用户代码中处理。

附加信息:'ReactiveUI.BindingMixins'的类型初始值设定项引发了异常。“

当我以这种方式替换Locator.Current时,看起来ViewModel仍然为null。

编辑:我认为我在代码中犯了一个小错误。这是修改后的版本:

        Locator.Current = new FuncDependencyResolver((service, contract) =>
        {
            return container.GetAllInstances(service);
        },
        (factory, service, contract) =>
        {
            container.AppendToCollection(service, Lifestyle.Transient.CreateRegistration(service, factory, container));
        });

编辑: 看起来问题是在调用GetAllInstances之后无法修改Simple Injector的容器,我猜FuncDependencyResolver就是这样做的。有解决方法吗?

1 个答案:

答案 0 :(得分:0)

我无法用SimpleInjector完全取代Splat。我必须保留IMutableDependencyResolver并在自定义FuncDependencyResolver中引用它。 Locator.Current基本上先是Splat,然后是SimpleInjector。这适用于RxUI使用Locator.Current。我的所有类都只在SimpleInjector中注册,不使用Locator.Current。

<title-component
    [title]="{{ 'KEY' | translate }}"
></title-component>