Azure状态服务 - 具有远程处理和自定义单一服务

时间:2018-04-16 13:06:00

标签: c# remoting service-fabric-stateful

我想在.net核心有状态服务中使用远程处理。我有一个自定义类,需要添加为单例。这可能吗?

首先,我尝试在Startup.cs的ConfigureServices()方法中注册自定义类,但后来我意识到这个方法永远不会被调用,因为我使用return this.CreateServiceRemotingReplicaListeners();在CreateServiceReplicaListeners中生成我的副本侦听器()方法,并删除了Kestrel配置(这将使该方法被调用)。

有没有办法让Startup.cs的ConfigureServices()方法被调用,或者在保持远程配置的同时在另一个地方添加单例服务?

MyStefulService.cs类中的CreateServiceReplicaListeners()方法如下所示:

protected override IEnumerable<ServiceReplicaListener>
CreateServiceReplicaListeners()
{
   return this.CreateServiceRemotingReplicaListeners();
}

Startup.cs中的ConfigureServices方法如下所示:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSingleton<IMyHandler>(x => new MyHandler());
    }

1 个答案:

答案 0 :(得分:1)

最后我找到了解决问题的方法:我使用Autofac来确保我注册的类在任何地方都是相同的实例。 我使用Autofac容器扩展了Program.cs,所以这样我根本不需要Startup.cs类:

我定义了自定义类的静态变量和一个Autofac容器,然后在Main()方法中添加了实现:

public static IContainer AutofacContainer;
private static IMyHandler _handler;

private static void Main()
{
    try
    {
        if (_autofacContainer == null)
        {
            var builder = new ContainerBuilder();

            builder.RegisterType<MyHandler>()
                .As<IMyHandler>()
                .SingleInstance();

            _autofacContainer = builder.Build();

            _handler = autofacContainer.Resolve<IMyHandler>();
        }

        //[...] normal service registration continues here
    }
    catch (Exception e)
    {
        ServiceEventSource.Current.ServiceHostInitializationFailed(e.ToString());
        throw;
    }          
}

由于容器是静态的和公共的,项目中的所有其他类都可以访问它并获取单例实例。 配置,环境变量等也可以从这里配置,类似于Startup.cs。