2013-04-05 17 views
0

我试图做的是以下几点:WCF - 从服务实现中调用方法

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

谢谢

回答

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); 
    } 
} 
+0

感谢您的回复。我试图实现您的建议,并遇到以下问题: 当具有带参数的构造函数时,我的Web服务失败。然后我尝试添加一个默认的构造函数到我的'UploadService'类中,像这样: 'public UploadService(){}' 当我执行'_uploadHandler.Upload(request)时,web服务现在可以工作,但'_uploadHandler'为null。 ;' 有没有真正简单的我失踪? – 2013-04-06 01:02:24

0

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

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

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

如果您决定不创建验证类每个然后请求有两种选择:

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