.NET IoC: настройка компонентов библиотеки из корня композиции (приложения) - PullRequest
2 голосов
/ 04 октября 2011

У меня есть библиотека, обрабатывающая взаимодействия с базой данных базы данных, которую я использую в большинстве своих приложений, и теперь я хочу преобразовать ее в структуру IoC (используя Autofac для внутреннего использования, но ее использование не должно зависеть от конкретного контейнера IoC или даже от использования один на всех). Как бы я поработал над подключением внутренних зависимостей библиотеки «по умолчанию», не заботясь о приложении, но имея возможность предоставить другие реализации при необходимости?

В качестве примера: библиотека может хранить и считывать учетные данные подключения для различных внутренних серверов на / с жесткого диска пользователя. Часть этой информации, по крайней мере пароли, зашифрованы, обычно с использованием шифрования по умолчанию, определенного в библиотеке, поэтому обычно я не хочу заботиться о деталях в моем приложении, которое использует библиотеку. Но могут быть случаи, когда мне нужно предоставить другой алгоритм шифрования (например, через интерфейс IConnectionEncryption) при вызове метода входа из моего приложения.

Что мне нужно сделать в моей библиотеке и в моем приложении, чтобы добиться этого?

Ответы [ 3 ]

3 голосов
/ 04 октября 2011

В общем, вы хотите, чтобы приложение позаботилось об этом. Вы сказали это сами - вы хотите выполнить настройку контейнера DI в корне композиции приложения (что является лучшей практикой).

Если вы храните какие-либо сведения о контейнере DI из библиотеки, другие разработчики смогут использовать свой контейнер по своему выбору (или вообще не использовать контейнер).

Если пойти другим путем, вы можете получить что-то вроде Rhino Service Bus , которое (в основном) зависит от конкретного контейнера DI. Если ваш проект с открытым исходным кодом, вы, вероятно, получите запросы на совместимость с контейнером X версии Y. Даже если он с закрытым исходным кодом, ваша команда может захотеть когда-нибудь изменить контейнеры.

Надеюсь, @Mark Seemann может дать канонический ответ. :)

0 голосов
/ 04 октября 2011

Я предполагаю, основываясь на названии вашего вопроса, что ваша цель состоит в том, чтобы сконфигурировать вашу библиотеку из корня композиции, но не требовать, чтобы приложение-потребитель знало, как зарегистрировать все для нее.сделать это с помощью Autofac означает создать один или несколько модулей :

public class SecurityModule : Module
{
    protected override void Load(ContainerBuilder builder)
    {
        builder.Register<Sha256ConnectionEncryption>.As<IConnectionEncryption>();

        // ...other security-related registrations...
    }
}

Теперь приложение может просто зарегистрировать модуль:

// In composition root

builder.RegisterModule<SecurityModule>();

Чтобы зарегистрироватьРазличные реализации интерфейса, вы можете просто предоставить эту регистрацию после регистрации модуля.Autofac использует последний подход к регистрации, что означает, что вы можете изменить любое из решений по умолчанию, принятых модулем:

// In composition root

builder.RegisterModule<SecurityModule>();

builder.Register<Sha512ConnectionEncryption>().As<IConnectionEncryption>();

Это приведет к тому, что Sha512ConnectionEncryption будет введено везде, где необходимо IConnectionEncryptionв приложении.

0 голосов
/ 04 октября 2011

Обнаружитель Common Service может вам помочь.Его задача - предоставить общий интерфейс для использования несколькими контейнерами IoC, чтобы вы или другие пользователи вашей библиотеки могли выбирать, какой контейнер интегрировать.

...