Как зарегистрировать впрыск перехвата для интерфейсов, которые наследуют интерфейс маркера?
-
12-12-2019 - |
Вопрос
Например, я хотел бы назвать следующий код, чтобы зарегистрировать весь набор услуг, которые я хочу ввести политику для:
container
.AddNewExtensionIfNotPresent<Interception>().Configure<Interception>().SetDefaultInterceptorFor<IBusinessService>(new InterfaceInterceptor());
.
Где:
ISomeServiceA : IBusinessService
ISomeServiceB : IBusinessService etc
.
Я думаю, что я читал, что вы не могут получить от isomeservcex для amarkeriNterface где-то .... Может ли это подтвердить.
Решение
Короче, посмотрите на загруженные сборки (добавьте дополнительную фильтрацию, если требуется - нет кэширования, если это сделано на Bootstrap) Добавление перехватчиков по умолчанию для типов, реализующих указанный маркер интерфейс.
container.AddNewExtensionIfNotPresent<Interception>();
Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
foreach (Assembly assembly in assemblies)
{
Type[] types = assembly.GetTypes().Where(x => x.IsClass && typeof(T).IsAssignableFrom(x) && x.GetType() != typeof(T)).ToArray();
foreach (Type t in types)
{
container.Configure<Interception>().SetDefaultInterceptorFor(t, new VirtualMethodInterceptor());
}
}
.
Редактировать:
Приведенное выше может быть сделано с использованием беглых API и означает, что у нас нет Naiive зависимостей на appdomain.currentdomain.gessemblies () (которые не содержат фильтрации, применяемую в Config apply api
.Include(If.Implements<IBusinessService>, (x, y) =>
{
if (x.IsClass)
y.Configure<Interception>().
SetDefaultInterceptorFor(x,
new VirtualMethodInterceptor
());
})
.