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

WCF-来自服务实现的调用方法,wcf,service,constructor,contract,Wcf,Service,Constructor,Contract,我想做的是: 1) 我有以下WCF服务合同: [ServiceContract] public interface IUploadService { [OperationContract] ServiceData Upload(Request request); } [DataContract] public class Request { [DataMember] public long AbnNumber; [DataMember] pub

我想做的是:

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
    }
}
在“一些代码”部分,我想调用一个验证类来验证客户机请求,如下所示:

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的新手,所以如果我完全走错了方向,请让我知道


谢谢

就我个人而言,我尽可能不喜欢我的服务方式。我将有一个单独的项目来处理上传。这样,您就可以更容易地重用此代码,并且在不创建服务的情况下测试功能

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

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

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);
    }
}
另一个项目中的处理程序如下所示

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);
    }
}
所以我的问题是:在Upload方法中创建我的验证类的实例是个坏主意吗

这取决于您是使用单件服务还是每次通话服务。通常,最好为每个请求创建新的服务实例,在这种情况下,可以在操作中创建所有实例

关于这个话题的有趣讨论

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

  • 让它成为单身
  • 为您的服务创建自定义ServiceHostFactory并在其中初始化您的服务(使用构造函数)。有关此主题的有用链接:

  • 谢谢你的回复。我试图实现您的建议,但遇到了以下问题:当使用带参数的构造函数时,我的web服务失败。然后,我尝试向我的
    UploadService
    类添加一个默认构造函数,如下所示:
    public UploadService(){}
    web服务现在可以工作,但当我执行
    \u uploadHandler.Upload(请求)时,
    \u uploadHandler
    为空有什么我真正缺少的简单的东西吗?