我已经实现了一个自定义的IParameterInspector
,并且希望它可以在我的服务的每个操作中执行。
我的理解是IParameterInspector
实现只能与IOperationBehavior
实现一起使用,并且内部IOperationBehavior
实现只能用于使用属性装饰单个操作。
有没有人知道是否有一种方法可以在服务级别注册我的IParameterInspector
,以便它可以在服务的所有操作中执行?
我已经实现了一个自定义的IParameterInspector
,并且希望它可以在我的服务的每个操作中执行。
我的理解是IParameterInspector
实现只能与IOperationBehavior
实现一起使用,并且内部IOperationBehavior
实现只能用于使用属性装饰单个操作。
有没有人知道是否有一种方法可以在服务级别注册我的IParameterInspector
,以便它可以在服务的所有操作中执行?
IParameterInspector
不需要在IOperationBehavior
级别上。它们可以在IServiceBehavior
级别上。在服务级别的ApplyDispatchBehavior
方法中,您需要循环遍历所有操作并分配检查器行为。
我的完整代码如下...
[AttributeUsage(AttributeTargets.Class)]
public class ServiceLevelParameterInspectorAttribute : Attribute, IParameterInspector, IServiceBehavior
{
public object BeforeCall(string operationName, object[] inputs)
{
// Inspect the parameters.
return null;
}
public void AfterCall(string operationName, object[] outputs, object returnValue, object correlationState)
{
}
public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
}
public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
{
}
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
{
foreach (ChannelDispatcher channelDispatcher in serviceHostBase.ChannelDispatchers)
{
if (channelDispatcher == null)
{
continue;
}
foreach(var endPoint in channelDispatcher.Endpoints)
{
if (endPoint == null)
{
continue;
}
foreach(var opertaion in endPoint.DispatchRuntime.Operations)
{
opertaion.ParameterInspectors.Add(this);
}
}
}
}
}