簡體   English   中英

如何在 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找到它。 我是否需要將上下文放在服務構造函數中自己的靜態類上,以便能夠在我的代碼中的其他地方獲得對它的引用?

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 容器才能真正使用它,例如在無狀態 Web 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();
                }))
        };
    }

否則你必須自己做。 已經有一些計划,請參閱計划以了解 AutoFac 擴展和Unity擴展。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM