Зарегистрируйте один и тот же интерфейс несколько раз - Autofac - PullRequest
1 голос
/ 25 апреля 2019

Я пытаюсь зарегистрировать интерфейс с другим конфигом, как показано ниже:

private static ContainerBuilder RegisterAzureStorage(this ContainerBuilder containerBuilder, IAzureStorageOptions azureStorageOptions)
    {
        containerBuilder.Register(c =>
                new AzureStorageKeyValuePersistenceService(
                    new AzureStorageKeyValuePersistenceConfig(
                        azureStorageOptions.DctAzureBlobConnectionString,
                        azureStorageOptions.DctAzureBlobContainerName)))
            .As<IStreamableKeyValuePersistenceService>()
            .Keyed<IStreamableKeyValuePersistenceService>(PersistenceStorageKeys.DctAzureStorage)
            .SingleInstance();

        containerBuilder.Register(c =>
                new AzureStorageKeyValuePersistenceService(
                    new AzureStorageKeyValuePersistenceConfig(
                        azureStorageOptions.NcsAzureBlobConnectionString,
                        azureStorageOptions.NcsAzureBlobContainerName)))
            .As<IStreamableKeyValuePersistenceService>()
            .Keyed<IStreamableKeyValuePersistenceService>(PersistenceStorageKeys.NcsAzureStorage)
            .SingleInstance();

        return containerBuilder;
    }

Тогда в моем конструкторе:

public ReportingController(
        [KeyFilter(PersistenceStorageKeys.DctAzureStorage)] IStreamableKeyValuePersistenceService dctStorage,
        [KeyFilter(PersistenceStorageKeys.NcsAzureStorage)] IStreamableKeyValuePersistenceService ncsStorage)
    {
        _dctStorage = dctStorage;
        _ncsStorage = ncsStorage;
    }

и использование:

await _dctStorage.SaveAsync(........);
await _ncsStorage.SaveAsync(........);

Тем не менее, при выполнении он берет только последнюю регистрацию и сохраняет оба объекта в одном месте.

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

public ReportingController(IEnumerable<IStreamableKeyValuePersistenceService> storage)
    {
        _storage = storage;
    }

и затем для каждого перечисляемого, но я бы предпочел использовать метод с ключами, если это возможно.

Есть идеи о том, что мне не хватает?

1 Ответ

1 голос
/ 25 апреля 2019

Для тех, кто сталкивался с этой проблемой в будущем, если я пропустил регистрацию, интерфейс выполнения в этом случае IReportingController должен быть зарегистрирован с помощью WithAttributeFiltering(), как показано ниже:

containerBuilder.RegisterType<ReportingController>().As<IReportingController>().WithAttributeFiltering();
...