Перехват Unity, Interceptor вызывается несколько раз с частичным отображением классов - PullRequest
1 голос
/ 23 августа 2011

Я искал исправление в течение нескольких дней, но безуспешно.

В основном мы используем Unity для двух вещей: внедрения зависимостей и, что более важно, для перехвата.

Я хочу, чтобы перехватчик срабатывал каждый раз, когда вызывается метод внутри частичного класса, но я вижу, что перехватчик вызывается несколько раз в зависимости от числа отображений, которые я создаю в web.config., что означает 2 отображения, 2 перехвата для каждого вызванного метода.

В примерах кода ниже все частичные классы имеют одинаковое имя, но реализуют разные интерфейсы, и все они находятся в разных файлах .cs, потому что эта библиотека будетбыть перемещенным в WCF в краткосрочной перспективе.Итак, у нас есть несколько частичных классов, которые выглядят следующим образом:

public partial class PartialClass : IInterface1
{
   ...
}
public partial class PartialClass : IInterface2
{
   ...
}

И файл конфигурации выглядит так:

<alias alias="IInterface1"     type="MyProject.Interface.IInterface1, MyProjectAssembly" />
<alias alias="IInterface2"     type="MyProject.Interface.IInterface1, MyProjectAssembly" />
<alias alias="PartialClass" type="MyProject.Services.PartialClass , MyProjectAssembly" />
<alias alias="Interceptor" type="MyProject.Services.Interceptor, MyProjectAssembly" />

<container>
extension type="Interception" />

<register type="IInterface1" mapTo="PartialClass">
    <lifetime  type="ContainerControlledLifetimeManager" />
    <interceptor type="InterfaceInterceptor"/>
    <interceptionBehavior type="Interceptor" />
</register> 

register type="IInterface2" mapTo="PartialClass">
    <lifetime  type="ContainerControlledLifetimeManager" />
    <interceptor type="InterfaceInterceptor"/>
    <interceptionBehavior type="Interceptor" />
</register> 
</container>

Наконец, конструктор, в котором необходим экземпляр любого частичного класса

public class MyClass()
{
    public MyClass(IInterface1 interface)
    {
         ...
    } 
    public MyClass()
    :this(Microsoft.Practices.Unity.UnityContainerExtensions.Resolve<IInterface1>(Container))
    {

    }
}

Проблема, с которой я столкнулся, заключается в том, что перехватчик вызывается ДВА раза за запрос, а это означает, что если я добавлю больше отображений (Interface3, Interface4 и т. Д.), Он будет вызываться 3 или 4 раза в зависимости отколичество отображений, которые я добавляю.

1 Ответ

0 голосов
/ 16 октября 2015

Если вы используете элемент isDefaultForType в одной из регистраций, он будет применяться ко всем регистрациям данного типа. Это предотвратит повторные вызовы обработчикам. Например

<register type="IInterface1" mapTo="PartialClass">
     <lifetime  type="ContainerControlledLifetimeManager" />
     <interceptor type="InterfaceInterceptor" isDefaultForType="True"/>
     <interceptionBehavior type="Interceptor" isDefaultForType="True"/>
</register> 

<register type="IInterface2" mapTo="PartialClass">
     <lifetime  type="ContainerControlledLifetimeManager" />
</register> 
...