Зарегистрируйте IReliableStateManagerReplica с помощью Autofac

У меня есть служба Stateful Service Fabric, у которой есть конструктор ниже.

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

Я использую Autofac для регистрации компонентов. Как я могу зарегистрировать IReliableStateManagerReplica с помощью Autofac? Я пытался

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)'.


person kowsalyav    schedule 12.02.2019    source источник
comment
Можете ли вы опубликовать код разрешения?   -  person Shahar Shokrani    schedule 12.02.2019


Ответы (1)


Назначение конструктора StatefulService(StatefulServiceContext, IReliableStateManagerReplica) - инициализировать новый экземпляр класса StatefulService с репликой надежного диспетчера состояний, отличной от стандартной.

Это означает, что вы реализовали собственную версию надежного поставщика состояния с настраиваемой логикой и не хотите использовать стандартную версию, реализованную в Service Fabric.

Если это не так, вы должны использовать конструктор по умолчанию StatefulService(StatefulServiceContext), а если вам нужен доступ к StateManager, вы можете получить к нему доступ из ((StatefulServiceContext)context).StateManager

Еще одна рекомендация, которую я вам даю: вам не следует создавать StatefulService с помощью DI, потому что StatefulServiceContext создается во время выполнения, и несколько реплик \ разделов могут повторно использовать один и тот же процесс в общем host, это означает, что у вас может быть несколько StatefulServiceContext, а DI не знает, какой из них использовать.

Взгляните на этот другой SO: Настроить внедрение зависимостей в Service Fabric с использованием контейнера DI ASP.NET Core по умолчанию

person Diego Mendes    schedule 13.02.2019
comment
Привет, ценю твою рекомендацию. Но если я хочу использовать собственный конструктор вместо конструктора по умолчанию, как мне зарегистрировать IReliableStateManagerReplica с помощью Autofac? Это можно сделать? - person kowsalyav; 13.02.2019