0

我想要做的是以下几点:

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

谢谢

4

2 回答 2

1

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

至于您是否应该像这样创建您的 Validation,它实际上取决于它的作用,但通常我会确保 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);
    }
}
于 2013-04-05T09:45:57.407 回答
0

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

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

关于这个主题的有趣讨论WCF 服务是否通常是单例的?

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

  1. 使其成为单例
  2. 为您的服务创建自定义 ServiceHostFactory 并在其中初始化您的服务(使用构造函数)。有关此主题的有用链接:使用 ServiceHostFactory 扩展托管将 StructureMap 与 WCF 集成
于 2013-04-07T23:22:17.570 回答