Модель клиент / сервер WCF - PullRequest
1 голос
/ 04 апреля 2009

Я хочу создать многофункциональное приложение, использующее модель клиент / сервер, с использованием WCF в качестве возможной коммуникационной структуры.

Я буду размещать службы в службе Windows (поэтому с WCF я бы использовал netTcpBinding).

Теперь, я полагаю, я мог бы определить каждую сервисную операцию в одном сервисном контракте, но могло быть довольно много операций, и я бы лучше разделил их на несколько связанных сервисных контрактов.

Будет ли разделение моих операций на набор сервисных контрактов означать, что мне придется размещать каждую службу на отдельном порту? (Это не было бы идеально, так как я бы предпочел запустить его на одном порту.)

Какие-нибудь советы по дизайну относительно этого сценария? Спасибо:)

Обновление

Извините за путаницу - я не собирался размещать каждую каждую сервисную операцию в другом контракте, только для того, чтобы разумно сгруппировать их. Моя проблема связана с тем, что я думал, что невозможно разместить несколько ServiceHosts на одном порту.

<шлепки по лбу>

Джо говорит, что можно просто разместить несколько сервисных хостов на одном порту. Я думаю, что я неправильно понял сообщение об исключении, когда пытался это сделать изначально. Если я смогу заставить это работать, то я думаю, что это будет моим любимым решением.

Я думаю, что подход @Koystya и co, заключающийся в реализации каждого интерфейса на одном конкретном объекте и размещении его в одном ServiceHost, также является хорошим прагматическим решением моего вопроса. Особенно, если вы рассматриваете этот конкретный объект как своего рода Фасад. Единственным недостатком, о котором я могу подумать, является то, что вы не сможете иметь различные варианты поведения в зависимости от контракта.

Кроме того, я согласен с логикой Джо, когда целесообразно реализовать несколько сервисных контрактов для одного конкретного класса.

Ответы [ 4 ]

2 голосов
/ 05 апреля 2009

Полагаю, я мог бы определить каждую сервисную операцию в одном сервисном контракте, но может быть довольно много операций, и я бы лучше разделил их на несколько связанных сервисных контрактов.

Имеет смысл объединить операции в согласованные сервисные контракты. Степень детализации (например, количество операций в контракте на обслуживание) будет зависеть от вашего приложения, но один контракт на обслуживание для одной операции кажется чрезмерным.

Будет ли разделение моих операций на набор сервисных контрактов означать, что мне придется размещать каждую службу на отдельном порту

Вовсе нет, вы можете иметь несколько сервисных контрактов на один и тот же порт.

У вас может быть конкретный класс, который реализует несколько сервисных контрактов , как рекомендует Koistya Navin .NET . Но:

  • Это внутренняя деталь реализации.

  • Я бы рассмотрел это только в том случае, если реализации контракта операции были настолько тесно связаны, что имеет смысл реализовать их в одном классе.

  • В этом случае может иметь смысл сделать их частью одного и того же контракта на обслуживание.

2 голосов
/ 05 апреля 2009

Сервис может предоставлять несколько сервисных контрактов.

Я бы создал службу WCF, реализованную как один класс, который сам реализует несколько интерфейсов с атрибутами [ServiceContract].

1 голос
/ 06 апреля 2009

Почему вы рассматриваете возможность включения каждой операции в свой контракт на обслуживание? Что вы намерены получить от этого?

По сути, контракт на обслуживание может иметь столько операций, помеченных [OperationContract], сколько вы хотите. Это, вероятно, имело бы больше смысла.

Если у вас есть разрозненные функции, вы всегда можете определить более одного ServiceContract (как интерфейс), и ваш класс обслуживания реализует их все и разместить один класс обслуживания (со всеми интерфейсами ServiceContract) по одному адресу (включая порт).

[ServiceContract]
public interface IMyService1
{
  [OperationContract]
  void SomeOperation1;

  [OperationContract]
  void SomeOperation2;
}

[ServiceContract]
public interface IMyService2
{
  [OperationContract]
  void SomeOperation21;

  [OperationContract]
  void SomeOperation22;
}

public class MyServiceClass : IMyService1, IMyService2
{
  void SomeOperation1;
  void SomeOperation2;
  void SomeOperation21;
  void SomeOperation22;
}

Марк

0 голосов
/ 05 апреля 2009

Как писал @Koistya, это возможно. И вот полный пример: пример .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...