如何在 Service Fabric 中获取可靠服务的 ServiceContext?

How to get the ServiceContext of a Reliable Service in Service Fabric?

Service Fabric 中可靠服务的 ServiceContext 注册到服务 program.cs 中的运行时(DI 容器):

ServiceRuntime.RegisterServiceAsync("RelDictQuerySvcType",
                    context => new RelDictQuerySvc(context)).GetAwaiter().GetResult();

如何从 DI 容器中取回 ServiceContext? ServiceRuntime 上没有 属性 来取回它。另外,我没有通过 FabricClient 找到它。我是否需要将上下文放在服务构造函数中自己的静态 class 上,以便能够在我的代码中的其他地方获取对它的引用?

Service Fabric并没有真正内置DI机制,至少是非常简单的。

如果你想将依赖项注入你的服务本身,你可以使用工厂。例如:

ServiceRuntime.RegisterServiceAsync("MyStatelessType",
                context =>
                {
                    var loggerFactory = new LoggerFactoryBuilder(context).CreateLoggerFactory(applicationInsightsKey);
                    ILogger logger = loggerFactory.CreateLogger<MyStateless>();

                    return new MyStateless(context, logger);
                }).GetAwaiter().GetResult();

这是一种在您的服务中注入具体实现的方法。该机制也用于注入上下文。不幸的是,由于它不是一个完整的 DI 容器,您无法在服务实例本身之外获得此上下文。

所以,你必须带上自己的 DI 容器才能真正使用它,例如在无状态网络中 api 你可以这样做:

    protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
    {
        return new[]
        {
            new ServiceInstanceListener(serviceContext =>
                new WebListenerCommunicationListener(serviceContext, "ServiceEndpoint", (url, listener) =>
                {
                    logger.LogStatelessServiceStartedListening<WebApi>(url);

                    return new WebHostBuilder().UseWebListener()
                                .ConfigureServices(
                                    services => services
                                        .AddSingleton(serviceContext)
                                        .AddSingleton(logger)
                                        .AddTransient<IServiceRemoting, ServiceRemoting>())
                                .UseContentRoot(Directory.GetCurrentDirectory())
                                .UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.None)
                                .UseStartup<Startup>()
                                .UseUrls(url)
                                .Build();
                }))
        };
    }

不然就得自己动手了。已经有一些举措,请参阅 this one for an AutoFac extensions and there is also a 扩展。