使用Autofac注册IReliableStateManagerReplica

4

我有一个具有以下构造函数的Stateful Service fabric服务。

public StatefuleService(StatefulServiceContext context, IReliableStateManagerReplica manager,
IActorProxyFactory actorProxyFactory = null)
            : base(context, manager)
        {
            ActorProxyFactory = actorProxyFactory ?? new ActorProxyFactory();
        }

我正在使用Autofac注册组件。我该如何使用Autofac注册IReliableStateManagerReplica? 我尝试过

builder.RegisterType<ReliableStateManager>().As<IReliableStateManagerReplica>().SingleInstance;

但是它会出现以下异常:

'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' 在类型 'Microsoft.ServiceFabric.Data.ReliableStateManager' 上找不到任何构造函数可以使用可用的服务和参数进行调用:无法解析构造函数参数 'System.Fabric.StatefulServiceContext serviceContext',该参数属于构造函数 'Void .ctor(System.Fabric.StatefulServiceContext, Microsoft.ServiceFabric.Data.ReliableStateManagerConfiguration)'。


你能发布解决方案的代码吗? - Shahar Shokrani
1个回答

1
构造函数StatefulService(StatefulServiceContext, IReliableStateManagerReplica)的目的是使用非默认的可靠状态管理副本初始化StatefulService类的新实例。
这意味着,您已经实现了自己版本的可靠状态提供程序,并且不想使用 Service Fabric 默认实现的版本。
如果不是这种情况,您应该使用默认构造函数StatefulService(StatefulServiceContext),如果需要访问StateManager,则可以从((StatefulServiceContext)context).StateManager访问它。
我向您提出另一个建议,您不应该使用DI创建StatefulService,因为StatefulServiceContext是在运行时创建的,多个副本\分区可以在共享主机中重用同一进程,这意味着您可能会有多个StatefulServiceContext,而DI不知道要使用哪一个。
请参阅以下其他SO:
使用默认ASP.NET Core DI容器在Service Fabric上设置依赖项注入

1
嗨,感谢您的推荐。但是如果我想使用自定义构造函数而不是默认构造函数,我该如何使用Autofac注册IReliableStateManagerReplica?这可行吗? - kowsalyav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接