Подтвердить что ты не робот

Применить атрибут WCF ко всем методам службы

У меня есть пользовательский атрибут, который я хочу применить к каждому методу в моей службе WCF.

Я продолжаю так:

[MyAttribute]
void MyMethod()
{

}

Проблема в том, что моя служба содержит сотни методов, и я не хочу писать [Attribute] прежде всего из них. Есть ли способ применить атрибут ко всем моим методам в моей службе?

Здесь моя подпись атрибута:

//[AttributeUsage(AttributeTargets.Class)]
public class SendReceiveBehaviorAttribute : Attribute, /*IServiceBehavior,*/ IOperationBehavior

ИЗМЕНИТЬ после ответа Aliostad:

Я пробовал это:

public void ApplyDispatchBehavior(ServiceDescription desc, ServiceHostBase host)
{
    foreach (ChannelDispatcher cDispatcher in host.ChannelDispatchers)
    {
        foreach (EndpointDispatcher eDispatcher in cDispatcher.Endpoints)
        {
            foreach (DispatchOperation op in eDispatcher.DispatchRuntime.Operations)
            {
                op.Invoker = new OperationInvoker(op.Invoker);
            }
        }
    }
}

И что:

public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
{
    foreach (ChannelDispatcher cDispatcher in serviceHostBase.ChannelDispatchers)
    {
        foreach (EndpointDispatcher eDispatcher in cDispatcher.Endpoints)
        {
            foreach (DispatchOperation op in eDispatcher.DispatchRuntime.Operations)
            {
                op.Invoker = new OperationInvoker(op.Invoker);
            }
        }
    }
}

Но это все еще не работает.

4b9b3361

Ответ 1

Согласно IServiceBehaviour, если вы реализуете этот интерфейс и создаете атрибут и помещаете его на уровне класса, он будет применяться ко всем операции:

Создайте настраиваемый атрибут, который реализует IServiceBehavior и использует его для обозначения классов обслуживания, которые должны быть модифицирована. Когда объект ServiceHost построенный, использует отражение для открыть атрибуты службы тип. Если какие-либо атрибуты реализуются IServiceBehavior, они добавляются к коллекция поведения по ServiceDescription.


UPDATE

Вместо того, чтобы внедрять IOperationBehaviour, добавьте требуемое поведение в IServiceBehaviour через для всех операций:

foreach (EndpointDispatcher epDisp in chDisp.Endpoints)
{
    epDisp.DispatchRuntime.MessageInspectors.Add(this);
    foreach (DispatchOperation op in epDisp.DispatchRuntime.Operations)
    {
        op.ParameterInspectors.Add(this); // JUST AS AN EXAMPLE 
    }                        
}

Ответ 2

Следующее должно сделать трюк, используя поведение службы, чтобы добавить правильное поведение операции, которое вызывает invoker.

public class MyAttribute : Attribute, IServiceBehavior, IOperationBehavior
{
    #region IServiceBehavior Members
    public void ApplyDispatchBehavior(ServiceDescription description, ServiceHostBase host)
    {
        foreach (ServiceEndpoint endpoint in host.Description.Endpoints)
        {
            foreach (var operation in endpoint.Contract.Operations)
            {
                operation.Behaviors.Add(this);
            }
        }
    }
    ...
    #endregion

    #region IOperationBehavior Members
    public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation)
    {
        dispatchOperation.Invoker = new OperationInvoker(dispatchOperation.Invoker);
    }
    ...
    #endregion
}

Ответ 3

Определите атрибут поведения службы, примените атрибут на уровне обслуживания. внутри поведения, итерации через все методы, определенные в контракте, и все материалы MyAttribute.

Ответ 4

Вы можете использовать операции AOP или post-build, чтобы вставлять атрибуты в скомпилированный код.

Ответ 5

Почему вы не используете T4 для генерации повторяемых кодов? Лучше использовать отражение во время компиляции, чем время выполнения.

Логически метод обслуживания - это вызывающий бизнес-метод. Таким образом, вы можете легко создавать методы обслуживания с необходимыми атрибутами, читая общедоступные методы бизнес-класса. Это нужно только при уделении внимания, когда мы реализуем бизнес-класс.