Como faço para registrar uma interceptação de injeção para interfaces que herdam um marcador de interface?

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

Pergunta

Por exemplo, eu gostaria de chamar o código a seguir para registrar todo um conjunto de serviços que eu quero injetar uma política para:

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

Onde:

ISomeServiceA  : IBusinessService
ISomeServiceB : IBusinessService etc 

Eu acho que eu li que você não posso obter a partir de ISomeServceX para IMarkerInterface em algum lugar....Isso pode ser confirmado.

Foi útil?

Solução

Em suma, o olhar carregado assembléias (adicionar filtragem extra, se necessário - sem cache, se isso for feito no bootstrap) Adicionar padrão de interceptores para os tipos de execução designado marcador de interface.

        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:

O acima pode ser feito usando a API fluente e significa que não temos o naiive dependência do Domínio de aplicação.CurrentDomain.GetAssemblies() (que não contêm a filtragem aplicada no fluent api de configuração

.Include(If.Implements<IBusinessService>, (x, y) =>
                                                          {
                                                              if (x.IsClass)
                                                                  y.Configure<Interception>().
                                                                      SetDefaultInterceptorFor(x,
                                                                                               new VirtualMethodInterceptor
                                                                                                   ());
                                                          })
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top