如何在 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 扩展。
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