高!
我正在尝试替换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
方法。