2

我在我的 wcf 应用程序中创建了一个服务合同,它包含很多方法。

OperationContract我发现为所有这些都写一个属性很烦人。

有什么简单的方法可以说“我的ServiceContract界面中的每个方法都是一个OperationContract”?

谢谢你

4

3 回答 3

2

不,您需要在每种方法上都这样做。它定义了作为服务中服务合同一部分的操作。某些方法可能不适用于曝光。

于 2013-09-10T14:30:43.847 回答
0

是的,您可以为此使用 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);
        }
    }
}

该属性用于标记不应该是操作契约的方法:

[AttributeUsage(AttributeTargets.Method)]
public sealed class NotOperationContractAttribute : Attribute
{
}

现在您需要做的就是将AutoServiceContract属性应用到服务接口。这将为接口添加ServiceContract属性,并且所有公共方法都将标记有OperationContact属性(具有属性的方法除外NotOperationContract):

[AutoServiceContract]
public interface IService1
{
    public void Method1();
    [NotOperationContact]
    public string Method2);
    public int Method3(int a);
    // ...
}
于 2013-09-10T14:43:12.663 回答
0

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 添加)。

于 2015-02-03T09:31:46.940 回答