我是 Service Fabric 的新手,正在使用下面的示例。 将 RegisterServiceAsync 与 new Service1(context) -> 结合使用将到达 Service1 的 RunAsync 方法。 将 RegisterServiceAsync 与我的 GetService(context) 一起使用 -> 将不断一遍又一遍地调用此方法。
Service Fabric
中为 .net core 控制台应用程序配置依赖项解析?我还没有成功做到这一点。我希望 Service1
有一些依赖项(在本示例中,是 IOptions
依赖项),并在我到达 RunAsync
时将它们注入,以便我可以使用它们。我可以在 Service1.CreateServiceInstanceListeners 声明我的依赖项解析,因为它是那里调用的第一个东西。这意味着我需要另一个对象来运行我的代码,在 RunAsync
中调用 - 依赖项由 CreateServiceInstanceListeners
中的代码解析。有没有办法让无状态服务本身已经解决依赖关系?
主要方法(不含Try/Catch):
ServiceRuntime.RegisterServiceAsync("Service1Type",
context => GetService(context)).GetAwaiter().GetResult();
//context => new Service1(context)).GetAwaiter().GetResult();
ServiceEventSource.Current.ServiceTypeRegistered(Process.GetCurrentProcess().Id, typeof(Service1).Name);
// Prevents this host process from terminating so services keep running.
Thread.Sleep(Timeout.Infinite);
GetService方法:
private static Service1 GetService(StatelessServiceContext context)
{
var serviceName = context.ServiceName;
var hostBuilder = new HostBuilder();
hostBuilder.ConfigureAppConfiguration((hostingContext, configBuilder) =>
{
configBuilder.AddJsonFile($"appsettings.{serviceName}.json", optional: true);
// Each service has it's own environmental appsettings file
configBuilder.AddJsonFile($"appsettings.{serviceName}.{hostingContext.HostingEnvironment.EnvironmentName}.json", optional: true);
})
.ConfigureServices((hostingContext, services) =>
{
services
.AddOptions<SettingsModel>()
.Bind(hostingContext.Configuration.GetSection(SettingsModel.SectionName))
.ValidateDataAnnotations();
});
var host = hostBuilder.Build();
return host.Services.GetService<Service1>();
}
服务1摘录:
private readonly SettingsModel _settingsModel;
public Service1(StatelessServiceContext context, IOptions<SettingsModel> settingsModel)
: base(context)
{
_settingsModel = settingsModel.Value;
}
我不知道如何解释(1)的问题,但我达到了我想要的结果,并且我了解到
DI Container
不依赖于 Host
对象(我认为是),也不是配置生成器。
只需注册依赖项并添加配置文件 + 由服务提供商发送依赖项解析即可完成此工作。
var configurationBuilder = new ConfigurationBuilder()
.AddJsonFile($"appsettings.json", optional: true)
.Build();
var services = new ServiceCollection();
services
.AddOptions<SettingsModel>()
.Bind(configurationBuilder.GetSection(SettingsModel.SectionName))
.ValidateDataAnnotations();
var serviceProvider = services.BuildServiceProvider();
ServiceRuntime.RegisterServiceAsync("Service1Type",
context => new Service1(context, serviceProvider.GetService<IOptions<SettingsModel>>())).GetAwaiter().GetResult();
ServiceEventSource.Current.ServiceTypeRegistered(Process.GetCurrentProcess().Id, typeof(Service1).Name);