我有一些在整个系统中使用的现有接口。
现在我想使用其中一个接口作为服务合同。
但问题是我需要在现有接口上添加[ServiceContract]
和[OperationContract]
属性,它们会污染其余代码。
在不复制接口的情况下可以解决这个问题吗?
将属性应用于具体实现?这是一个好习惯吗?
谢谢
您可以简单地使用 service-warpper 类型接口扩展接口,即:
public interface IMyCode
{
string GetResult();
}
[ServiceContract]
public interface IMyCodeService : IMyCode
{
[OperationContract]
string GetResult();
}
C#允许接口继承,编译器会吐出IMyCodeService.GetResult
需要new的警告,因为它隐藏了IMyCode.GetResult
方法,但不追加new
不会破坏实现,例如:
class Program
{
static void Main(string[] args)
{
MyCodeService service = new MyCodeService();
IMyCodeService serviceContract = (IMyCodeService)service;
IMyCode codeContract = (IMyCode)service;
service.GetResult();
serviceContract.GetResult();
codeContract.GetResult();
Console.ReadKey();
}
}
public interface IMyCode
{
void GetResult();
}
public interface IMyCodeService : IMyCode
{
void GetResult();
}
public class MyCodeService : IMyCodeService
{
public void GetResult()
{
Console.Write("I am here");
}
}
这样,您可以在不更改现有代码的情况下提供基于现有接口的服务合同。
如果您共享您的合同程序集而不是使用 WCF 为您生成代理,您甚至可以在您接受现有接口的地方传递您的服务合同,因为服务接口继承自它。
我们正在慢慢尝试迁移到 WCF 并遇到同样的问题。除了用属性装饰服务接口之外,我们想不出另一种方法。它们是属性,因此希望不会过多地污染代码。
我们必须做的一件事(从遗留 Web 服务移动时,确保所有依赖项都移动到公共位置,以便可以从 Global.aspx 和 WCF 主机服务调用它们)
您必须在具体实现上实现属性(主要是与 ServiceBehavior 相关的属性),以便 WCF Host 可以托管它。至于OperationContract,我们主要应用在接口上。