3

我有一些在整个系统中使用的现有接口。

现在我想使用其中一个接口作为服务合同。

但问题是我需要在现有接口上添加[ServiceContract][OperationContract]属性,它们会污染其余代码。

在不复制接口的情况下可以解决这个问题吗?

将属性应用于具体实现?这是一个好习惯吗?

谢谢

4

2 回答 2

7

您可以简单地使用 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 为您生成代理,您甚至可以在您接受现有接口的地方传递您的服务合同,因为服务接口继承自它。

于 2012-05-14T09:31:53.480 回答
0

我们正在慢慢尝试迁移到 WCF 并遇到同样的问题。除了用属性装饰服务接口之外,我们想不出另一种方法。它们是属性,因此希望不会过多地污染代码。

我们必须做的一件事(从遗留 Web 服务移动时,确保所有依赖项都移动到公共位置,以便可以从 Global.aspx 和 WCF 主机服务调用它们)

您必须在具体实现上实现属性(主要是与 ServiceBehavior 相关的属性),以便 WCF Host 可以托管它。至于OperationContract,我们主要应用在接口上。

于 2012-05-14T09:17:49.673 回答