WCF - 来自服务实现的调用方法

时间:2013-04-05 08:41:46

标签: wcf service constructor contract

我要做的是以下内容:

1)我有以下WCF服务合同:

[ServiceContract]
public interface IUploadService
{
    [OperationContract]
    ServiceData Upload(Request request);
}

[DataContract]
public class Request
{
    [DataMember]
    public long AbnNumber;

    [DataMember]
    public string Email;
}

2)这份合同是这样实施的。

public class UploadService : IUploadService
{
    public bool Upload(Request request)
    {
       // Some code
    }
}

在“Some code”部分中,我想调用验证类来验证客户端请求,如下所示:

var result = validation.ValidateRequest(request);

所以我的问题是:在Upload方法中创建验证类的实例是不是一个坏主意?像这样:

public class UploadService : IUploadService
{
    public bool Upload(Request request)
    {
       var validation = new Validation();

       var result = validation.ValidateRequest(request);
    }
}

我知道你可以通过创建一个构造函数来解决这个问题,但据我所知你不能在WCF服务实现类中创建一个构造函数,或者我错了吗?

我是WCF的新手,所以如果我完全走向错误的方向,请告诉我。

由于

2 个答案:

答案 0 :(得分:1)

我个人认为我的服务方法尽可能少。我会有一个单独的项目来处理上传。这样,您就可以更轻松地重用此代码,并在不创建服务的情况下测试功能。

至于你是否应该像这样创建验证,它实际上取决于它的作用,但通常我会确保Validation类实现一个包含ValidateRequest(Request)的接口,然后注入它。如果需要,您可以在测试中模拟它。

所以你的服务代码看起来像是

public class UploadService : IUploadService
{
    private readonly IUploadHandler _uploadHandler;

    public UploadService(IUploadHandler uploadHandler)
    {
        _uploadHandler = uploadHandler;
    }

    public bool Upload(Request request)
    {
       //would possibly do some mapping here to create a different type of object to pass to the handler
       _uploadHandler.Upload(request);
    }
}

并且不同项目中的处理程序看起来像

public class UploadHandler : IUploadHandler
{
    private readonly IValidation _validator;

    public UploadHandler(IValidation validator)
    {
        _validator = validator;
    }

    public bool Upload(Request request)
    {
        return _validator.ValidateRequest(request);
    }
}

答案 1 :(得分:0)

  

所以我的问题是:在Upload方法中创建验证类的实例是不是一个坏主意?

归结为您是使用Singleton还是Per Call服务。通常最好为每个请求创建一个新的Service实例,在这种情况下,可以在您的操作中创建所有实例。

有关此主题的有趣讨论Should WCF service typically be singleton or not?

如果您决定不为每个请求创建Validation类,则有两个选项:

  1. 让它成为单身人士
  2. 为您的服务创建自定义ServiceHostFactory并在其中初始化您的服务(使用构造函数)。有关此主题的有用链接:Extending Hosting Using ServiceHostFactoryIntegrating StructureMap with WCF