Уровень подготовки по шкале MS: 400
Некоторое время назад я рассказывал про чудесный IoC\DI контейнер StructureMap. На тот момент я описал основные приемы работы, скорее как справочник, показавший возможности, без углубления в конкретные темы. На этот раз я хочу рассказать о возможности автоматического обнаружения и регистрации классов средствами StructureMap.
Уже по самому названию понятно, что это хорошо и несет благодать, так как обещает сократить трудовые расходы и написание тривиального кода, что всегда скучно и всегда забываешь его дописать где-то. Авторегистрация решит все эти проблемы, хотя, конечно, сначала придется попыхтеть.
Дальнейшие примеры покажут, как работать с обнаружением только по интерфейсу\базовому классу, а так же как работать при именовании классов по соглашениям (Convention over Configuration).
Вводная
Сначала достаточно простой пример. Пусть у нас есть множество классов для трансляции данных из базы, все они наследованы от базового класса. Т.е. что-то в духе:
1 2 3 4 5 6 7 |
public class ClientAdapter : ReadOnlyAdapter<Client, vClient> { ... } public class InvoiceAdapter : WriteAdapter<Invoice, vInvoice> { ... } |
И таких классов достаточно много, всех их регистрировать вручную не очень хочется, т.к. это выглядит ужасно в коде и писать долго. Регистрация таких адаптеров может занять экран, а то и два. Гораздо лучше поднапрячь извилины и записать это в несколько строк.
Итак, StructureMap предоставляет метод Scan, который пробегает по интересующим нас сборкам или папкам и регистрирует подходящие объекты. Для того чтобы метод Scan нашел и зарегистрировал типы необходимо соблюдение нескольких условий:
- Тип должен быть явным, дженерик типы не регистрируются автоматически;
- Тип должен иметь публичный конструктор;
- Конструктор не может иметь аргументов примитивных типов;
- Множественное регистрирование не допускается.
Указание сборки для сканирования можно задать несколькими способами:
- Явно прописать имя сборки или же передать ее саму;
- Обратиться к вызывающей сборке;
- Найти сборку содержащую определенный тип;
- Найти сборки по определенному пути.