ReactiveUi:使用AutoFac时,如何替换默认的IViewLocator



高!

我正在尝试替换WPF中ReactiveUi/Splat的默认IViewLocator。我正在使用AutoFac作为容器。

我的目标很简单:在解析视图对视图模型时,ReactiveUi/Splat应该使用我的IViewLocator自定义实现。

我真的读了所有可用的教程和stackoverflow线程,但没有任何帮助。

目前我在引导时做以下事情:(我尝试了很多不同的事情…)

namespace MDM
{
public static class Bootstrapper
{
private static AutofacDependencyResolver? Locator;
private static IContainer? Container;
public static void Register()
{
Splat.Locator.CurrentMutable.InitializeSplat();
Splat.Locator.CurrentMutable.InitializeReactiveUI();
Splat.Locator.CurrentMutable.RegisterConstant<IViewLocator>(new ViewLocator());
var builder = new ContainerBuilder();
builder.RegisterType<MainWindowView>().As<IViewFor<MainWindowViewModel>>().SingleInstance();
builder.RegisterType<EinstellungenView>().As<IViewFor<EinstellungenViewModel>>().SingleInstance();
builder.RegisterType<MainWindowViewModel>().AsSelf().SingleInstance();
builder.RegisterType<EinstellungenViewModel>().AsSelf().SingleInstance();
Locator = builder.UseAutofacDependencyResolver();
builder.RegisterInstance(Locator);
Locator.InitializeReactiveUI();
Splat.Locator.SetLocator(Locator);
Container = builder.Build();
Locator.SetLifetimeScope(Container);
}
public static T Resolve<T>() where T : class
{
return Container!.Resolve<T>();
}
}
}

在调试我的IViewLocator中的以下代码行时,从未命中:

public IViewFor? ResolveView<T>(T viewModel, string? contract = null)
{
}

所以我的问题是:引导时我需要做什么,告诉ReactiveUi使用我的IViewLocator?

如果您决定放弃Splat(ReactiveUI使用的IoC容器)并使用Autofac,那么您必须使用它,尤其是当注册服务时
一旦您(正确地)注册了自定义IoC容器,就不应该再使用Splat来解决任何依赖关系。尽管Splat会将服务请求重定向到Autofac容器,但我建议不要混合使用API。

var containerBuilder = new ContainerBuilder();
// TODO::Register application's dependencies with Autofac
/* Configure Splat to use Autofac */
var autofacResolver = containerBuilder.UseAutofacDependencyResolver();
containerBuilder.RegisterInstance(autofacResolver);
autofacResolver.InitializeReactiveUI();
// AFTER configuring the IoC redirect, register the Splat service overrides
containerBuilder.RegisterType<ViewLocator>()
.As<IViewLocator>()
.SingleInstance();
var container = containerBuilder.Build(); 
autofacResolver.SetLifetimeScope(container);

不要使用服务定位器反模式。IoC容器不应分布在整个应用程序中。既不是作为注入引用,也不是作为静态引用
请改用抽象工厂模式。

因此,IViewLocator.ResolveView必须使用工厂,而不是您在Bootstrapper中实现的静态Resolve方法。

相关内容

  • 没有找到相关文章

最新更新