Как вы уже нашли, RegisterResolveInterceptor
позволяет перехватывать тип, который разрешается непосредственно из контейнера. Это означает, что если вы вызываете GetInstance<ILogger>()
, то RegisterResolveInterceptor
позволяет обернуть вокруг ILogger
, но он не исчезнет с какой-либо из его зависимостей.
Чтобы подключиться к созданию типа, вы можете использовать одну из перегрузок RegisterInitializer
. RegisterInitializer
в первую очередь означает добавление некоторой дополнительной инициализации к типу, создаваемому Simple Injector, но для него есть другие интересные варианты использования.
В случае, если у вас есть определенный тип, который вы хотите получить уведомление о том, вы можете использовать RegisterInitializer<T>(Action<T>)
перегрузку, в котором можно указать тип или абстракции вы заинтересованы в Например:.
container.RegisterInitializer<ILogger>(logger =>
{
System.Console.WriteLine(logger.ToString());
});
В этом случае инициализатор будет подсесть к любой регистрации, которая назначаемый из ILogger
, например:
container.Register<ILogger>(() => new DbLogger());
container.Register<ILogger, FileLogger>();
container.Register<EventLogLogger>();
Все три регистрации (при условии EventLogLogger
орудия ILogger
) получит обогащенный с инициализатором.
Если, однако, не существует определенного типа или абстракции, на которые вы хотите наложить крючок, а скорее на широкий диапазон типов, или вам нужно иметь больше информации о типе (например, о его образе жизни), вы можете использовать второй RegisterInitializer
перегрузка. Эта перегрузка принимает действие, которое будет выполнено, и предикат, который позволяет указать, к каким регистрациям будет отправлено действие. Например:
container.RegisterInitializer(
data => System.Console.WriteLine(data.Registration.ImplementationType.Name),
context => context.Registration.Lifestyle == Lifestyle.Singleton);
предыдущий фрагмент кода регистрирует инициализатор, который будет записывает имя типа, созданного в консоли, в случае, если регистрация является Singleton
. Пример того, что вы можете сделать с этим, можно найти в Glimpse plugin for Simple Injector. Плагин Glimpse uses это RegisterInitializer
перегрузка, чтобы он мог сообщить пользователю, какие типы создаются во время конкретного запроса.
Спасибо, Стивен! Вторая перегрузка RegisterInitializer - именно то, что я искал, так как мне нужно обрабатывать любой тип. Это для моей библиотеки, которая отслеживает объекты (сохраняется и применяет их свойства). Например. расположение и размеры окон, настройки конфигурации, последние введенные данные и т. д. Благодаря интеграции с IOC с одной строкой кода я могу подключить отслеживание для всех объектов, которые создаются контейнером, что является очень аккуратным! – anakic
Я просто поставлю это здесь (https://github.com/anakic/Jot), если вы достаточно любопытны, чтобы заглянуть :) – anakic