我想在.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());
}
答案 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。