解决Azure Service Fabric Stateless Service自身的依赖关系

问题描述 投票:0回答:1

我是 Service Fabric 的新手,正在使用下面的示例。 将 RegisterServiceAsync 与 new Service1(context) -> 结合使用将到达 Service1 的 RunAsync 方法。 将 RegisterServiceAsync 与我的 GetService(context) 一起使用 -> 将不断一遍又一遍地调用此方法。

  1. 为什么会发生这种情况?我认为这是因为在那里创建了主机。我在其他地方看到过这种方法,所以我认为它应该有效。
  2. 如果此设置不好 - 如何在
    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;
    }
dependency-injection azure-service-fabric dependency-resolution
1个回答
0
投票

我不知道如何解释(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);
© www.soinside.com 2019 - 2024. All rights reserved.