¿Cómo registro una inyección de intercepción para interfaces que heredan una interfaz marcadora?
-
12-12-2019 - |
Pregunta
Por ejemplo, me gustaría llamar al siguiente código para registrar un conjunto completo de servicios que quiero inyectar una política para:
container
.AddNewExtensionIfNotPresent<Interception>().Configure<Interception>().SetDefaultInterceptorFor<IBusinessService>(new InterfaceInterceptor());
donde:
ISomeServiceA : IBusinessService
ISomeServiceB : IBusinessService etc
Creo que leí que usted no puedo obtener de Isomeservcex a ImarkerInterface en algún lugar ... Se puede confirmar esto.
Solución
En resumen, mire los ensamblajes cargados (agregue un filtrado adicional si es necesario, no hay almacenamiento en caché si se realiza en BootStrap) Agregue los interceptores predeterminados para los tipos que implementan la interfaz marcadora designada.
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());
}
}
Editar:
Lo anterior se puede hacer usando la API fluida y significa que no tenemos la dependencia de NAIIVE en AppDomain.currentDomain.getassemblies () (que no contendría el filtrado aplicado en la configuración de API con fluidez
.Include(If.Implements<IBusinessService>, (x, y) =>
{
if (x.IsClass)
y.Configure<Interception>().
SetDefaultInterceptorFor(x,
new VirtualMethodInterceptor
());
})