C# 如何将OperationContract应用于接口中的所有方法

C# 如何将OperationContract应用于接口中的所有方法,c#,wcf,attributes,servicecontract,operationcontract,C#,Wcf,Attributes,Servicecontract,Operationcontract,我正在我的wcf应用程序中创建一个服务契约,它包含很多方法 我发现为所有人编写OperationContract属性非常烦人 有没有简单的方法可以说“我的ServiceContract界面中的每个方法都是OperationContract” 谢谢你不,你需要在每种方法上都这样做。它定义了作为服务中服务合约一部分的操作。有些方法可能不用于公开。是的,您可以使用AOP框架进行公开。例如,使用PostSharp: [Serializable] public sealed class AutoServi

我正在我的wcf应用程序中创建一个服务契约,它包含很多方法

我发现为所有人编写
OperationContract
属性非常烦人

有没有简单的方法可以说“我的
ServiceContract
界面中的每个方法都是
OperationContract


谢谢你

不,你需要在每种方法上都这样做。它定义了作为服务中服务合约一部分的操作。有些方法可能不用于公开。

是的,您可以使用AOP框架进行公开。例如,使用PostSharp:

[Serializable]
public sealed class AutoServiceContractAttribute : TypeLevelAspect, IAspectProvider
{
    // This method is called at build time and should just provide other aspects.
    public IEnumerable<AspectInstance> ProvideAspects(object targetElement)
    {
        Type targetType = (Type)targetElement;

        var introduceServiceContractAspect =
            new CustomAttributeIntroductionAspect( 
                new ObjectConstruction(typeof(ServiceContractAttribute)
                                          .GetConstructor(Type.EmptyTypes)));
        var introduceOperationContractAspect =
            new CustomAttributeIntroductionAspect( 
                new ObjectConstruction(typeof(OperationContractAttribute)
                                         .GetConstructor(Type.EmptyTypes)));

        // Add the ServiceContract attribute to the type.
        yield return new AspectInstance(targetType, introduceServiceContractAspect);

        // Add a OperationContract attribute to every relevant method.
        var flags = BindingFlags.Public | BindingFlags.Instance;
        foreach (MethodInfo method in targetType.GetMethods(flags))
        {
            if (!method.IsDefined(typeof(NotOperationContractAttribute), false))
                yield return new AspectInstance(method, introduceOperationContractAspect);
        }
    }
}
现在,您只需将
AutoServiceContract
属性应用于服务接口。这将向接口添加
ServiceContract
属性,所有公共方法都将标记为
OperationContact
属性(具有
NotOperationContract
属性的方法除外):


Spring.Net具有内置功能
ServiceExporter
,您所需要的就是这样的配置:

<object id="MyServiceExporter" type="Spring.ServiceModel.ServiceExporter, Spring.Services">
  <property name="TargetName" value="MyService" />
  <property name="TypeAttributes">
  <list>
    <object type="System.ServiceModel.ServiceBehaviorAttribute, System.ServiceModel">
      <property name="ConfigurationName" value="MyService"/>
    </object>
  </list>
  </property>
</object>
<object id="MyService" singleton="false" type="Eluzzion.TOrder.Service.OrderExportService, Eluzzion.TOrder.Service" />
<object id="MyServiceHost" type="Spring.ServiceModel.Activation.ServiceHostFactoryObject, Spring.Services" lazy-init="false" >
  <property name="TargetName" value="MyServiceExporter" />
</object>

有关更多详细信息,请查看和查看此。您需要在
app.config
中调用与Spring对象相同的服务定义:
MyService


下一步是使用
DataContract
属性装饰所有对象。有什么想法吗?不太好的方法是在服务契约上使用
XmlSerializerFormat
属性(也可以由Spring添加)。

好的,我只是希望有一种方法可以明确地说每个方法都是我的服务契约的一部分。我认为微软应该支持这样的选择。不过-谢谢:)有没有像PostShartp这样的AOP免费工具?@JohnSmith PostSharp有免费许可证(不确定是否可以在免费版中添加属性)。你可以看一看
[AutoServiceContract]
public interface IService1
{
    public void Method1();
    [NotOperationContact]
    public string Method2);
    public int Method3(int a);
    // ...
}
<object id="MyServiceExporter" type="Spring.ServiceModel.ServiceExporter, Spring.Services">
  <property name="TargetName" value="MyService" />
  <property name="TypeAttributes">
  <list>
    <object type="System.ServiceModel.ServiceBehaviorAttribute, System.ServiceModel">
      <property name="ConfigurationName" value="MyService"/>
    </object>
  </list>
  </property>
</object>
<object id="MyService" singleton="false" type="Eluzzion.TOrder.Service.OrderExportService, Eluzzion.TOrder.Service" />
<object id="MyServiceHost" type="Spring.ServiceModel.Activation.ServiceHostFactoryObject, Spring.Services" lazy-init="false" >
  <property name="TargetName" value="MyServiceExporter" />
</object>