2016-11-05 4 views
1

Я знаю, что могу использовать container.Options.RegisterResolveInterceptor, чтобы получать уведомления каждый раз, когда объект разрешен, но для моего сценария я хотел бы получать уведомления только в том случае, если объект был создан.Простой инжектор - могу ли я перехватить создание объекта

Например, если тип был зарегистрирован как Lifestyle.Singleton, я бы хотел, чтобы мой делегат запускался при первом разрешении типа (когда экземпляр singleton создается), но не при последующих вызовах для разрешения.

Есть ли простой способ сделать это?

ответ

1

Как вы уже нашли, 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 перегрузка, чтобы он мог сообщить пользователю, какие типы создаются во время конкретного запроса.

+0

Спасибо, Стивен! Вторая перегрузка RegisterInitializer - именно то, что я искал, так как мне нужно обрабатывать любой тип. Это для моей библиотеки, которая отслеживает объекты (сохраняется и применяет их свойства). Например. расположение и размеры окон, настройки конфигурации, последние введенные данные и т. д. Благодаря интеграции с IOC с одной строкой кода я могу подключить отслеживание для всех объектов, которые создаются контейнером, что является очень аккуратным! – anakic

+0

Я просто поставлю это здесь (https://github.com/anakic/Jot), если вы достаточно любопытны, чтобы заглянуть :) – anakic

 Смежные вопросы

  • Нет связанных вопросов^_^