将参数添加到WCF中的每个操作合同

时间:2014-03-21 09:40:51

标签: c# wcf

我需要更新现有的Web服务,并为每个操作合同添加2个参数。 有没有办法通过重载类或从接口继承来自动添加这些?

要清楚我想要什么,这是一个例子: 我现在有

[OperationContract]
MyObject MyMethod(int parameter);

我现在需要

[OperationContract]
MyObject MyMethod(string otherParameter, int parameter);

无需重写每项操作。

3 个答案:

答案 0 :(得分:1)

不,没有办法通过继承向方法添加参数。此外,WCF方法cannot be overloaded,因此添加具有相同名称但具有额外参数的方法也不是一种选择。

最简单的方法是手动更新接口(服务合同)及其实现(实际服务本身)。

但是,你可以对此非常聪明(虽然可能不是一个好主意)但是WCF有一些可以使用的扩展点。

您可以控制消息的序列化/反序列化方式,您可以指定如何选择特定操作,总而言之,您可以在不更改合同的情况下实现所需的操作。然而,努力肯定不仅仅是手动更新界面和实现。

Here's一个解释这些可扩展性点的好资源

如果您只想识别用户,可以通过服务方法中的OperationContext.Current.ServiceSecurityContext来识别用户,this resource会举例说明如何实现这一目标。

答案 1 :(得分:0)

如果要使用该附加参数更改每个operationContract的实现,则更改签名并不是什么大问题。

如果您不打算使用该参数,添加该参数需要什么?

答案 2 :(得分:-2)

你绝对需要'这个参数由调用者传递?

如果没有,您可以使用IOC容器在实例化时通过构造函数将其传递给每个WCF服务。

要在Ninject中执行此操作,您需要注册以下内容....

Bind<ISomeService>().To<MyWcfService>()
    .WithConstructorArgument("otherParameter", theParameterValue);

上面的例子假设引入的参数不会因每次调用而改变。

如果每次调用都改变了,你可以传递一个方法而不是一个变量,或者使用一个lambda ......

Bind<ISomeService>().To<MyWcfService>()
    .WithConstructorArgument("otherParameter", () => { /* TODO calculate value */ });

如果您不熟悉IOC容器和依赖注入,可以read about them here

由于其简单的API和SimpleInjector,我建议performance