如何将WCF服务添加到现有的类库中

4
我有一个包含多个项目的大型MVC解决方案。我计划创建一个单独的解决方案,其中包含WCF服务,并将一些消耗高资源的项目移动到该解决方案中。想法是MVC应用程序将与WCF通信以满足任何计算需求。
问题是我不知道如何调用现有的类和接口,这些类和接口已经具有对服务的接口。我的类/接口:
public interface IHelloWorld
{
    string SayHello(string name);
}

public class HelloWorld : IHelloWorld
{
    public string SayHello(string name)
    {
        return string.Format("Hello, {0}", name);
    }
}

这个类中有数百种方法,但只有其中的一些会被暴露给WCF。

现在我需要在新创建的WCF服务中调用这个类。我不确定:

  • 我是否需要修改现有类以转换为svc.cs(服务),还是可以创建一个单独的服务文件并在其中调用现有方法?
  • 服务类还需要一个接口,该接口将在web.config中定义(终结点契约)。我应该创建一个仅包含我要公开的方法的单独接口,还是应该使用类库中的现有接口?如果我使用类接口,则必须在web.config中提到相同的接口。

我有点困惑该如何最好地完成它。我不想修改现有类,但想添加一个新的服务,我可以在那里连接并调用。新的svc.cs文件如下:

[ServiceContract]
public interface IHelloWorldService
{
    [OperationContract]
    string SayHello(string name);
}

public class HelloWorldService : IHelloWorldService
{
    private IHelloWorld helloWorld = new HelloWorld();
    public string SayHello(string name)
    {
        return helloWorld.SayHello(name);
    }
}

这个设计看起来像是在重复现有的类/接口。不确定这是否是正确的方式,请帮忙确认一下。

1个回答

2
我需要修改现有类来转换为svc.cs(服务),还是可以创建一个单独的服务文件并在其中调用现有方法?
不需要,因为您说并非所有方法都需要公开。
当前的设计似乎重复了现有的类/接口。如果这样做是否正确,请帮忙确认。
是的,如果您按照问题中展示的代码进行操作,那么就会出现重复的情况。 您可以像这样编写您的服务代码:
[ServiceContract]
public interface IHelloWorldService
{
    [OperationContract]
    string SayHello(string name);
}

public class HelloWorldService : IHelloWorldService
{
    private IHelloWorld helloWorld = new HelloWorld();

    public string SayHello(string name)
    {
        return helloWorld.SayHello(name);
    }
}

通过在您的服务上使用合约,您不会重复逻辑,并且只有所需的方法将通过HelloWorldService合同公开。

是的,这是我的错误。感谢您指出,我已经更新了我的帖子。不管怎样,我想知道这是否是最好的方法。 - sarojanand
我还想知道,如果我的 HelloWorld 类有15个属性,那么我是否需要在 HelloWorldService 类中添加所有这些带有 [DataMember] 属性的属性? - sarojanand
@sarojanand - 是的,你需要包含DataMember属性,否则该属性将不会在服务公开的类型上可用。 - tom redfern

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接