我正在尝试使用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就是这样做的。有解决方法吗?
答案 0 :(得分:0)
我无法用SimpleInjector完全取代Splat。我必须保留IMutableDependencyResolver并在自定义FuncDependencyResolver中引用它。 Locator.Current基本上先是Splat,然后是SimpleInjector。这适用于RxUI使用Locator.Current。我的所有类都只在SimpleInjector中注册,不使用Locator.Current。
<title-component
[title]="{{ 'KEY' | translate }}"
></title-component>