Comment enregistrer une injection d'interception pour des interfaces qui héritent d'une interface de marqueur?

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

Question

Par exemple, je voudrais appeler le code suivant pour enregistrer tout un ensemble de services que je souhaite injecter une stratégie pour:

container
            .AddNewExtensionIfNotPresent<Interception>().Configure<Interception>().SetDefaultInterceptorFor<IBusinessService>(new InterfaceInterceptor());

Où:

ISomeServiceA  : IBusinessService
ISomeServiceB : IBusinessService etc 

Je pense que je lis que vous ne peut pas aller de Isomeservcex à ImarkerInterface quelque part .... Peut-il être confirmé.

Était-ce utile?

La solution

En bref, regardez les assemblages chargés (ajouter un filtrage supplémentaire si nécessaire - aucune mise en cache si cela est effectué sur Bootstrap) Ajouter des intercepteurs par défaut pour les types Mise en œuvre de l'interface de marqueur désignée.

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

EDIT:

Ce qui précède peut être effectué à l'aide de l'API fluide et signifie que nous n'avons pas la dépendance naïve sur AppDomain.CurrentDomaine.GetAssemblages () (qui ne contiendraient pas le filtrage appliqué dans la configuration API

.Include(If.Implements<IBusinessService>, (x, y) =>
                                                          {
                                                              if (x.IsClass)
                                                                  y.Configure<Interception>().
                                                                      SetDefaultInterceptorFor(x,
                                                                                               new VirtualMethodInterceptor
                                                                                                   ());
                                                          })

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top