1

我想要做的是让统一在一个对象上注册两个不同的 InterceptorBehaviors。我发现了两个通过容器应用拦截器的示例。它们似乎单独工作,但是当我尝试将它们一起使用时,界面拦截行为似乎并未尝试确定基于属性的行为。我在如何配置容器时做错了什么?

这是界面...

 public interface ISomeInterface{

    [NullWarningBehaviorAttribute]
    void WillLogWarningIfNull(string someValue);


    void WillThrowException();
}

这是实现类...

public class SomeImplementation : ISomeInterface {

    [NullWarningBehaviorAttribute]
    public void WillLogWarningIfNull(string someValue) {

    }

    public void WillThrowException() {
    }
}

这是基于属性的行为...

 public class NullWarningBehavior : ICallHandler{

    public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext)
    {
        return getNext()(input, getNext);
    }

    public IMethodReturn Invoke(IMethodInvocation input, GetNextHandlerDelegate getNext)
    {
        return getNext()(input, getNext);
    }

    public int Order { get; set; }
}

public class NullWarningBehaviorAttribute : HandlerAttribute {
    public override ICallHandler CreateHandler(IUnityContainer container) {
        return container.Resolve<NullWarningBehavior>();
    }
}

这是接口拦截行为

public class ExceptionLoggingBehavior : IInterceptionBehavior {

    public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext) {
        return getNext()(input, getNext);
    }

    public IEnumerable<Type> GetRequiredInterfaces() {
        return Type.EmptyTypes;
    }

    public bool WillExecute {
        get {
            return true;
        }
    }
}

此代码将正确检测属性并调用 NullWarningBehaviorAttribute 上的构造方法以创建 ICallHandler。

var uc = new UnityContainer();
        uc.AddNewExtension<Interception>();
uc.RegisterType<ISomeInterface, SomeImplementation>(
          .Configure<Interception>()
          .SetDefaultInterceptorFor<ISomeInterface>(new InterfaceInterceptor());

以这种方式配置容器将成功创建接口拦截器。

  uc.RegisterType<ISomeInterface, SomeImplementation>(
      new Interceptor<InterfaceInterceptor>(),
      new InterceptionBehavior<ExceptionLoggingBehavior>());

我在想我可以简单地将这两种方法结合起来,但是当我这样做时,NullWarningBehaviorAttribute CreateHandler 方法永远不会被调用。有没有特定的配置方法?

 uc.RegisterType<ISomeInterface, SomeImplementation>(
            new InterceptionBehavior<ExceptionLoggingBehavior>())
          .Configure<Interception>()
          .SetDefaultInterceptorFor<ISomeInterface>(new InterfaceInterceptor());
4

0 回答 0