[英]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();
}))
};
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.