2010-11-10 16 views
13

Mam zaimplementowany niestandardowy IParameterInspector i chcę go wykonać dla każdej operacji w mojej usłudze.WCF Same IParameterInspector dla wszystkich operacji w usłudze

Rozumiem, że implementacje IParameterInspector mogą być używane tylko z implementacjami IOperationBehavior, a implementacja stażysta IOperationBehavior może być używana tylko do dekorowania poszczególnych operacji przy użyciu atrybutu.

Czy ktoś wie, czy istnieje sposób, w jaki mogę zarejestrować mój IParameterInspector na poziomie usługi, aby mógł on wykonywać wszystkie operacje w usłudze?

Odpowiedz

14

Dzięki this i kolejnym this znalazłem to, czego szukałem.

IParameterInspector nie musi być na poziomie IOperationBehavior. Mogą być na poziomie IServiceBehavior. W metodzie poziomu usługi ApplyDispatchBehavior należy przejść przez wszystkie operacje i przypisać zachowanie inspektora.

Moja klasa w całości ...

[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); 
       } 
      } 
     } 
    } 
} 
+2

nieco stary, ale dlaczego kontynuować rozmowy w kodzie? – itchi

+1

@itchi Jeszcze starszy, ale zgaduję, ponieważ "kolekcja zawiera obiekty ChannelDispatcherBase (i nie tylko instancje ChannelDispatcher), ponieważ jest również używana przez programistów, którzy chcą zachować model programowania Windows Communication Foundation (WCF), ale zastąpić "dostarczany przez system". Wygląda na to, że kod mógł wywołać wyjątek dotyczący nieprawidłowego rzutowania. Byłoby lepiej użyć keep ChannelDispatcherBase i użyć operatora "as". – trydis

Powiązane problemy