Come posso registrare un'iniezione di intercettazione per le interfacce che ereditano un'interfaccia marcatrice?
-
12-12-2019 - |
Domanda
Ad esempio vorrei chiamare il seguente codice per registrare un'intera serie di servizi che voglio iniettare una politica per:
container
.AddNewExtensionIfNotPresent<Interception>().Configure<Interception>().SetDefaultInterceptorFor<IBusinessService>(new InterfaceInterceptor());
.
Dove:
ISomeServiceA : IBusinessService
ISomeServiceB : IBusinessService etc
.
Penso di aver letto che Cant Ottieni da ISOMESRCEX a IMARKERINTERFACE da qualche parte .... Può essere confermato.
Soluzione
In breve, guarda i gruppi caricato (aggiungere il filtraggio extra se necessario - nessun cache se questo è fatto su bootstrap) Aggiungi intercettori predefiniti per i tipi di implementazione dell'interfaccia di marcatore designata.
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());
}
}
.
Modifica:
Quanto sopra può essere fatto usando l'API fluente e significa che non abbiamo la dipendenza Naitiva su appDomain.CurrentDomain.GetAssemblies () (che non conteneva il filtraggio applicato nell'applicazione fluente API
.Include(If.Implements<IBusinessService>, (x, y) =>
{
if (x.IsClass)
y.Configure<Interception>().
SetDefaultInterceptorFor(x,
new VirtualMethodInterceptor
());
})
.