微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 ReactiveUI 中,如何为 MutableDependencyResolver 调用 GetService

如何解决在 ReactiveUI 中,如何为 MutableDependencyResolver 调用 GetService

我正在阅读《你、我和 ReactiveUI》这本书,我的问题与 https://github.com/kentcb/YouIandReactiveUI 上这本书的源代码有关。自代码发布以来,ReactiveUI 和 Splat 的版本发生了变化,其中一部分代码无法在当前版本中复制。我已经联系了作者,在发布这个问题时仍在等待回复,所以我在这里提交这个问题。

在 App.xaml.cs 中有一个对 Registrations.cs 类的调用,该类传递当前的可变依赖解析器:

public App()
{
    this.autoSuspendHelper = new AutoSuspendHelper(this);
    Registrations.Register(Splat.Locator.CurrentMutable);
}

在 Registrations.cs 类中,有一行获取 IMutableDependencyResolver 并调用 GetService:

public static void Register(IMutableDependencyResolver container)
{
    ...

    var defaultviewLocator = container.GetService<IViewLocator>();

    ...
}

我也想获得 IVewLocator 服务,但 IMutableDependencyResolver 不再有 GetService 方法

所以我的问题是,应该如何修改这段代码以具有相同的功能

Splat.Locator.Current 是一个 IReadonlyDependonyResolver,它有一个 GetService 方法。应该用它代替吗?我不确定我是否应该改用 Splat.Locator.Current 以防使用 Splat.Locator.CurrentMutable 是有原因的,我想确保如果我改用 Splat.Locator.Current 它不会介绍任何意想不到的东西。

更新:

只想补充一点,从 DPVreony 的回答中了解到,它通常是实现两个接口的同一个类,我能够在我需要的 Registrations.cs 类中实现一些后面的行。

因此,在该类中,还有一些行注册常量。这些需要可变的依赖解析器。因此,您可以将只读和可变参数传递给 Registrations 类,并在需要的地方使用它们,如下所示:

public static void Register(IReadonlyDependencyResolver container,IMutableDependencyResolver mutableContainer)
{

    ...

    var defaultviewLocator = container.GetService<IViewLocator>();

    ...

    mutableContainer.RegisterConstant(viewLocator,typeof(IViewLocator));

    ...

    var defaultActivationForViewFetcher = container.GetService<IActivationForViewFetcher>();
       
    ...
        
    mutableContainer.RegisterConstant(activationForViewFetcher,typeof(IActivationForViewFetcher));
    mutableContainer.RegisterConstant(activationForViewFetcher,typeof(IForcibleActivationForViewFetcher));
}

然后像这样调用方法

Registrations.Register(Splat.Locator.Current,Splat.Locator.CurrentMutable);

解决方法

由于某些 DI 容器在注册服务时的行为方式(即它们不断重新初始化),Splat 发生了变化。所以 get 功能被拆分到 Splat.Locator.Current 暴露的 IReadonlyDependenyResolver 上

这是为了鼓励使用 MutableLocator 来完成所有事情的心态,然后你应该只需要使用 Splat.Locator.Current 阅读,这样你就可以使用它了。通常它是实现 2 个接口的同一个类,因此这是一种语义更改,以减少错误地拆除定位器的风险。

简而言之,是的 Splat.Locator.Current 用于 GetService

希望一切都有意义。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。