Применить атрибут WCF ко всем методам в службе - PullRequest
10 голосов
/ 29 марта 2011

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

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

[MyAttribute]
void MyMethod()
{

}

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

Вот подпись моего атрибута:

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

РЕДАКТИРОВАТЬ после ответа Алиостада:

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

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);
            }
        }
    }
}

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

Ответы [ 5 ]

8 голосов
/ 17 ноября 2011

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

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
}
6 голосов
/ 29 марта 2011

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

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


ОБНОВЛЕНИЕ

Вместо реализации 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 
    }                        
}
0 голосов
/ 26 августа 2013

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

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

0 голосов
/ 29 марта 2011

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

0 голосов
/ 29 марта 2011

Определить атрибут поведения сервиса, применить атрибут на уровне сервиса. в рамках поведения выполните итерацию по всем методам, определенным в контракте, и выполните все действия MyAttribute.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...