Д.И .: Различные реализации одного и того же интерфейса для разных контроллеров - PullRequest
0 голосов
/ 23 октября 2018

У меня есть два контроллера:

namespace V1
{
    [ApiVersion("1.0")]
    public class SomeController : Controller
    {
        public SomeController(IProvider provider) { }
    }
}

namespace V2
{
    [ApiVersion("2.0")]
    public class SomeController : Controller
    {
        public SomeController(IProvider provider) { }
    }
}

И следующие сервисы:

public interface IStorage { }
public interface IProvider { }
public class V1Storage : IStorage { }
public class V2Storage : IStorage { }
public class Provider : IProvider
{
    public Provider(IStorage storage) { }
}

Для первой версии контроллера мне нужно использовать V1Storage, для второй - V2Storage.Я знаю, что есть способ заменить DefaultControllerFactory, но как лучше его реализовать?

1 Ответ

0 голосов
/ 23 октября 2018

Вы можете использовать AddControllersAsServices , чтобы помочь с этим.Документация описывает, что эта функция:

Регистрирует обнаруженные контроллеры как сервисы в IServiceCollection.

Вот полный пример кода, который я опишу далее:

void ConfigureServices(IServiceCollection services)
{
    services.AddMvc()
        .AddControllersAsServices();

    services.AddTransient(sp => new V1.SomeController(new Provider(new V1Storage())));
    services.AddTransient(sp => new V2.SomeController(new Provider(new V2Storage())));
}

Перерегистрируя V1.SomeController и V2.SomeController после вызова AddControllersAsServices, вы берете под контроль их точное построение, передавая реализацию IProvider, сконфигурированную с требуемой реализацией IStorageдля каждого контроллера.

Эндрю Локк описывает этот подход в своем блоге: Активация контроллера и внедрение зависимостей в ASP.NET Core MVC .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...