Поделиться экземпляром между контейнерами AutoFac - PullRequest
0 голосов
/ 05 июля 2018

У меня проблема с обслуживанием без сохранения состояния, в котором есть 2 контейнера AutoFac

В моем контейнере есть экземпляр PriceService, созданный метод Main для Program.cs

В моем файле Startup.cs создается второй контейнер (это неизбежно, поскольку для настройки AutoFac для Web API требуется другая логика)

Это вызывает у меня проблему, потому что когда я иду к решению IPriceService, я получаю сервис, который не содержит данных, потому что при запуске

создается новый экземпляр

Я видел, как объединить 2 контейнера, но как мне получить контейнер, созданный в моем методе Program.cs Main?

Если я смогу получить его, я планирую создать новый контейнер, который не включает IPriceService, а затем добавить мой PriceService из контейнера ServiceFabric в мой контейнер, который будет использоваться стороной веб-API

Кто-нибудь пробовал что-нибудь подобное?

Дополнительная информация

Мой контейнер всегда создавался в методе Main программы.cs

У меня не может быть 1 контейнера, потому что для использования AutoFac для MVC / контроллеров необходимо интегрировать сервисы, которые доступны только в классах запуска

Класс запуска не вызывается в нужное время, поэтому нет никакой возможности получить эту дополнительную информацию в мой основной контейнер

Дополнительное примечание Я думаю, что реальная проблема здесь может быть немного другой, я вызываю InstancePerCall при регистрации контроллеров. Это, в свою очередь, создает новый экземпляр моего сервиса, а не использует существующий. Так что, возможно, мой вопрос должен быть, как я могу избежать этого? Могу ли я использовать SingleInstance для контроллеров?

1 Ответ

0 голосов
/ 06 июля 2018

Если вы зарегистрируете свой сервис в Program.cs Main, вы можете добавить его в конструктор Service Fabric Service:

public MySFService(IMyRegistredService myRegistredService, StatelessServiceContext context) : base(context)
{
    this.myRegistredService = myRegistredService;
}

Затем при создании WebHost вы можете зарегистрировать этот сервис в WebAPI:

new WebHostBuilder().UseKestrel()
    .ConfigureServices(services =>
    {
        services.AddSingleton(myRegistredService);
    })
    ...
...