我一直在寻找解决这个问题几天没有运气。
基本上我们使用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次,具体取决于映射的数量I加。
答案 0 :(得分:0)
如果您在其中一个注册中使用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>