Prism 7 DI 中的 Register、RegisterInstance 与 RegisterSingleton

Rez*_*eza 4 c# prism

我正在尝试在 Prism 7 中注册 DI 服务。我发现以下所有方法都有效,哪一个是正确的方法?各自的情况如何?

public class AndroidInitializer : IPlatformInitializer
{
    static OpenAppService openAppService = new OpenAppService();

    public void RegisterTypes(IContainerRegistry containerRegistry)
    {
        containerRegistry.RegisterInstance<IOpenAppService>(openAppService);

        containerRegistry.Register<IFacebookLoginService, FacebookLoginService>();

        containerRegistry.RegisterSingleton<IAppleSignInService, AppleSignInService>();

    }
}
Run Code Online (Sandbox Code Playgroud)

Hau*_*ger 8

首先,这些方法的作用完全取决于所使用的实际容器,尤其是当您超越完全微不足道的事情时。这可能是没有这方面的文档的主要原因。

话虽如此...

  • Register表示在注入给定接口时应该使用给定的服务,并且将为每个注入创建一个新实例。
  • RegisterSingleton不同之处在于所有注入都使用相同的实例。
  • RegisterInstance与 相同RegisterSingleton,但您必须提供一个实例。

这是正确的方法吗?各自的情况如何?

因此,大多数时候服务都注册为单例,因为您希望视图模型能够通过服务进行通信。示例:EventAggregator当一个视图模型发布一个事件时,您希望其他视图模型接收该事件,只有当他们使用与发布者发布的相同实例进行订阅时,才有可能实现这一点。不过,WCF 客户端不需要是单例,因为通信发生在服务器端。

您不想注册实例,因为这会混淆注册和解析,并且您必须绝对确保在创建实例来注册实例时已经注册了实例的所有依赖项(通过调用Resolve,它本身具有一丝邪恶)。如果您在一种方法中注册所有内容,那么这不是一个问题,但如果您有多个(相互依赖的)模块,这会变得更加令人头痛。