WCF:如何在单独的项目中实现逻辑以实现契约接口?

时间:2012-08-06 11:59:33

标签: c# wcf

像标题所说的那样,我希望将我的逻辑保存在与服务合同不同的项目中,这样就可以保持独立和隐藏。我已经看到它说这可以做到,但我找不到任何关于如何的例子。

我将所有必要的代码移到了另一个项目中,但是当我测试它时,只有类型对客户端可见,而不是方法。

所有方法都在界面中标记为[OperationContract]

我猜测除了Class : IInterface之外,必须有一种专门将实现逻辑连接到契约的方法,否则,如果有2个相似的类会发生什么,例如:Class1 : IInterfaceClass2 : IInterface? WCF如何知道要使用哪个类?

2 个答案:

答案 0 :(得分:11)

我这样做了(对不好的名字,这仅仅是为了概念):

1)创建单独的实施项目
2)为服务合同创建单独的项目(避免循环引用)
3)增加服务合同项目作为实施项目的参考 4)增加合同和实施项目到主办项目
5)更新了具有完整类型名称的Service.svc

enter image description here

Service.svc正文:

<%@ ServiceHost Language="C#" Debug="true" Service="Implementation.ServiceImplementation" %>

答案 1 :(得分:3)

  

WCF如何知道要使用哪个类?

因为你告诉它,在各种配置文件中。


我可以衷心地推荐WCF the Manual Way…the Right Way以获得动力,并完整地了解您正在尝试做的事情 - 我在这里只是这种实现的相关要点。

您有三个程序集:ServiceClientServiceContracts(仅限接口)。 ServiceClient都引用ServiceContractsService包含实现接口的类。 Client代理类:

using System.ServiceModel;
using ServiceContracts;

public class ExampleServiceProxy : ClientBase<IExampleService>, IExampleService
{
    public string ExampleMethod()
    {
        return Channel.ExampleMethod();
    }
}

客户端的config文件包含指向服务的svc文件的条目;服务的svc文件如下所示:

<%@ ServiceHost Language="C#" Debug="true" Service="Service.ExampleService" 
    CodeBehind="ExampleService.svc.cs" %>

服务.svc.cs文件如下:

using ServiceContracts;

public class ExampleService : IExampleService
{
    public string ExampleMethod()
    {
        return string.Empty;
    }
}

就是这样!