Перехватывать 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;