2013-04-05 4 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

Спасибо за ваш ответ.Я попытался реализовать ваше предложение и наткнулся на следующие проблемы: Ошибка моего веб-службы при наличии конструктора с параметром. Затем я попытался добавить конструктор по умолчанию к моему классу «DownloadService» следующим образом: 'public UploadService() {}' Теперь веб-служба работает, но '_uploadHandler' имеет значение null при выполнении' _uploadHandler.Upload (request) ; ' Есть ли что-то действительно простое, что мне не хватает? –

0

Так что мой вопрос: Является ли это плохая идея, чтобы создать экземпляр моего класса проверки внутри метода загрузки?

Все зависит от того, будете ли вы использовать услуги Singleton или Per Call. Обычно лучше иметь новый экземпляр службы, созданный для каждого запроса, и в этом случае нормально создавать все экземпляры в вашей операции.

Интересная дискуссия на эту тему Should WCF service typically be singleton or not?

Если вы решили не создавать класс валидации для каждого затем запросить есть два варианта:

  1. Сделать одноточечно
  2. Создание пользовательских ServiceHostFactory для вашей службы и инициализируйте свою службу в ней (с помощью конструктора). Полезные ссылки по этой теме: Extending Hosting Using ServiceHostFactory, Integrating StructureMap with WCF
Смежные вопросы