Применить атрибут 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);
}
}
}
}
Но это все еще не работает.
Ответы
Ответ 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 для генерации повторяемых кодов?
Лучше использовать отражение во время компиляции, чем время выполнения.
Логически метод обслуживания - это вызывающий бизнес-метод. Таким образом, вы можете легко создавать методы обслуживания с необходимыми атрибутами, читая общедоступные методы бизнес-класса. Это нужно только при уделении внимания, когда мы реализуем бизнес-класс.