我想要做的是让统一在一个对象上注册两个不同的 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());