我有一些现有的接口,可以在整个系统中使用。
现在,我想使用其中一个接口作为服务契约。
但问题是,我需要在现有接口上添加[ServiceContract]和[OperationContract]属性,它们会污染代码的其余部分。
有没有解决这个问题的办法,不复制接口?
将属性应用于具体实现?这是一个很好的实践吗?
谢谢
发布于 2012-05-14 17:31:53
您可以简单地使用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-14 17:17:50
我们正在慢慢地尝试迁移到WCF,但也遇到了同样的问题。除了用属性来装饰服务接口之外,我们找不到其他的方法。它们是属性,所以希望不会对代码造成太大的污染。
我们必须做的一件事(当从遗留Web服务迁移时,确保所有依赖项都被移动到公共位置,以便可以从Global.aspx和WCF主机服务调用它们)
您必须在具体实现上实现属性(主要是与ServiceBehavior相关的属性),以便WCF Host可以托管它。至于OperationContract,我们主要应用于接口。
https://stackoverflow.com/questions/10580327
复制相似问题