Как вы разрешаете определенную службу с ключами в ASP.NET Core при использовании Autofac?

Я создал простой API-интерфейс ASP.NET Core, скажем, у меня есть интерфейс, как показано ниже:

public interface ITestService
{
    string GetDate();
}

Я использую Autofac для обработки DI, для вышеуказанного интерфейса у меня есть два зарегистрированных типа (TestService и TestComponent, реализующие ITestService):

builder.RegisterType<TestService>().As<ITestService>().Keyed<ITestService>("service");
builder.RegisterType<TestComponent>().As<ITestService>().Keyed<ITestService>("component");

Я знаю, что я могу зарегистрировать свой тип, чтобы использовать любое из этих привязок, и я знаю, что есть способ получить правильный тип, как описано здесь:

var services = serviceProvider.GetServices<ITestService>();
var testComponent= services.First(o => o.GetType() == typeof(TestComponent));

Поскольку я использую Autofac и зарегистрировал свои типы с помощью Keyed Services, как мне решить правильный ITestService с помощью IServiceProvider и ключ, который я предоставил в своих привязках ("сервис" или "компонент")?

+2
источник поделиться
2 ответа

В соответствии с документацией существует два более чистых способа решения ключевых служб. Вы можете разрешить использование индекса:

public class TestServiceConsumer
{
    private ITestService testService;    

    public TestServiceConsumer(IIndex<string, ITestService> testServices)
    {
        testService = testServices["service"];
    }
}

Это также можно сделать с помощью атрибута (он кажется более подходящим для вашего случая):

public class TestServiceConsumer
{
    private ITestService testService;    

    public TestServiceConsumer([KeyFilter("service")] ITestService testService)
    {
        this.testService = testService;
    }
}
+1
источник

Ну, похоже, есть способ разрешить ключевые услуги, используя ILifetimeScope

public class TestService
{
    private readonly ILifetimeScope _scope;
    public TestService(ILifetimeScope scope)
    {
        _scope = scope;
    }
}

Хотя это не рекомендуется, я смог получить желаемый тип:

var service = _scope.ResolveKeyed<ITestService>("service");

Узнайте больше об этом здесь.

-1
источник

Посмотрите другие вопросы по меткам или Задайте вопрос