我在我的 wcf 应用程序中创建了一个服务合同,它包含很多方法。
OperationContract
我发现为所有这些都写一个属性很烦人。
有什么简单的方法可以说“我的ServiceContract
界面中的每个方法都是一个OperationContract
”?
谢谢你
我在我的 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);
}
}
}
该属性用于标记不应该是操作契约的方法:
[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);
// ...
}
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 添加)。