Come posso registrare un'iniezione di intercettazione per le interfacce che ereditano un'interfaccia marcatrice?

StackOverflow https://stackoverflow.com//questions/11672325

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.

È stato utile?

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
                                                                                                   ());
                                                          })
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top