Перехватывать IEnumerable список типов интерфейсов с Unity DI/IoC

Всем, кто может помочь,

Я новичок в контейнере Unity и начинаю способ фильтрации коллекций, содержащих определенный интерфейс, используя перехват. Применение перехвата является новым для меня, даже с моим опытом работы с AutoFac и Castle. Однако я знаю, что это можно сделать, но мне просто трудно понять, почему мой перехватчик не сработает.

По сути, цель состоит в том, чтобы отфильтровать коллекцию объектов на основе уровня безопасности зарегистрированного пользователя. Интерфейс был назван ISecurable, и он требует, чтобы его разработчики имели свойство MinSecurityLevel. К сожалению, большая часть кодовой базы не программируется на интерфейсах, поэтому этот интерфейс является новым. В связи с этим существует несколько коллекций, в которых будут использоваться разработчики этого интерфейса, т.е.

Customer[] Customers { get; set; }
List<Order> Orders { get; set; }

Где Заказы и Клиенты реализуют ISecurable.

Таким образом, вместо того, чтобы находить каждую коллекцию, содержащую объекты, реализующие ISecurable, и фильтровать эти коллекции на основе уровня безопасности вошедшего в систему пользователя (который станет монстром для обслуживания и неприятным для входа пользователя в систему на уровне безопасности). Я полагал, что ЛЮБОЙ перехват, содержащий объекты ISecurable, будет простым и элегантным способом выполнения этого требования, сохраняя код в одном месте.

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

Кажется, что я нахожусь в той же лодке, что и плакат здесь: Unity Interception - Custom InterceptionBehavior

К сожалению, я не знаю, как он / она смогли подключить CallHandler и / или InterceptionBehavior, чтобы начать фильтровать их коллекцию (плюс, их кодовая база программирует по интерфейсу, т.е. IList, моя кодовая база имеет зависимости от конкретных типов Array и список).

Вот некоторая версия кода, которую я пробовал (без блокировки запуска какого-либо свойства или метода класса Handler или InterceptionBehavior):

 container.AddNewExtension<Interception>();
 container.RegisterType<SecurityHandler>();

 container.RegisterType<IEnumerable<ISecurable>, Customer[]>(
      new Interceptor<TransparentProxyInterceptor>(),
      new InterceptionBehavior<SecurableInterceptionBehavior>());

 container.RegisterType<IEnumerable<ISecurable>, List<Order>>(
      new Interceptor<TransparentProxyInterceptor>(),
      new InterceptionBehavior<SecurableInterceptionBehavior>());

 container.Configure<Interception>)
      .AddPolicy("SecurityPolicy")
      .AddCallHandler(new SecurityHandler());

Я пробовал приведенный выше код с и без SecurityHandler, я получаю тот же результат - без перехвата.

Спасибо всем, кто помогает!

Вот ссылки, которые я использовал до сих пор:

https://msdn.microsoft.com/en-us/library/ff660851(v=pandp.20).aspx

PS Из-за отсутствия репутации мне не удалось опубликовать более 2 ссылок, на которые я ссылался. Извини:(

РЕДАКТИРОВАТЬ

Я могу заставить мой перехватчик сработать, если разрешу тип из контейнера.

В качестве теста это сработало:

 container.RegisterType<ISecurable, Customer>(
      new Interceptor<InterfaceInterceptor>(),
      new InterceptionBehavior<SecurableInterceptionBehavior>());

 var securable = container.resolve<ISecurable>();
 securable.MinSecurityLevel = 1;

0 ответов

Другие вопросы по тегам