我需要更新现有的Web服务,并为每个操作合同添加2个参数。 有没有办法通过重载类或从接口继承来自动添加这些?
要清楚我想要什么,这是一个例子: 我现在有
[OperationContract]
MyObject MyMethod(int parameter);
我现在需要
[OperationContract]
MyObject MyMethod(string otherParameter, int parameter);
无需重写每项操作。
答案 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。