2

我正在尝试拦截 WCF 客户端。但是 Unity 拦截器似乎不起作用。

  1. 我没有接到代理的电话。
  2. 我不知道如何将属性链接到容器
  3. 在 AddPolicy 中,name 属性是什么 - 这里我使用了拦截函数 - GetXml。
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Method)]
public class GetXmlCallHandlerAttribute : HandlerAttribute
{
  public GetXmlCallHandlerAttribute(){}
  public override ICallHandler CreateHandler(IUnityContainer ignored)
  {
    return new GetXmlTestCallHandler();
  }
}
public class GetXmlTestCallHandler : ICallHandler
{
  public int Order { get; set; }  
  public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
  {
    IMethodReturn msg;
    Object returnValue = XElement.Load("../../Resources/a1.xml");
    Object[] outputs = null;
    msg = input.CreateMethodReturn(returnValue, outputs);
    return msg;        
  }
} 
class SendDataTest
{
  public void GetXmlTest()
  {
    IUnityContainer container = new UnityContainer();
    ICallHandler myInterception = new GetXmlTestCallHandler();    
    container.AddNewExtension<Interception>();
    container.RegisterType<SendData>(new Interceptor(new TransparentProxyInterceptor()));
    container.Configure<Interception>().AddPolicy("GetXml").AddCallHandler(myInterception);
    SendData target = container.Resolve<SendData>();
    XElement expected = null; // TODO: Initialize to an appropriate value
    XElement actual;
    actual = target.GetXml();
    Assert.AreEqual(expected, actual);
    Assert.Inconclusive("Verify the correctness of this test method.");
  }
}
4

1 回答 1

1

您需要做几件事:-

您需要在注册 SendData 时添加 InterceptionBehaviour() 例如

    container.RegisterType<SendData>(new InterceptionBehaviour<PolicyInjectionBehaviour>(), new Interceptor(new TransparentProxyInterceptor()));

这是为了让 Unity 知道参与您创建的任何策略。TransparentProxyInterceptor 只是说明如何实际执行拦截。

您还需要在要拦截的适当方法上应用属性 - 我假设您已经在 SendData 类的 GetXml 方法上完成了该操作。

于 2012-10-19T10:05:54.003 回答