Вызов служб WCF без использования WCF - хорошая или плохая практика? - PullRequest
3 голосов
/ 23 апреля 2011

Я разрабатываю сервис-ориентированную архитектуру для приложения, и я хотел бы, чтобы сервисы были доступны как через WCF, так и для использования через простую библиотеку.В идеале я хотел бы уменьшить дублирующийся код.

Концептуально это соответствует:

Клиент => Служба WCF => Библиотека служб (фактическая реализация)

или

Клиент => Сервисная библиотека (фактическая реализация)

в зависимости от того, где находится клиент (локальный или удаленный).

Вот простой пример:

[ServiceContract]
public interface ICalculator
{
    [OperationContract]
    int Add(int a, int b);
}

public class Calculator : ICalculator
{
    public int Add(int a, int b)
    {
        return a + b;
    }
}

public class CalculatorFactory
{
    public static ICalculator CreateCalculator()
    {
        return new Calculator();
    }
}

И мое клиентское приложение сделало следующее

int result = CalculatorFactory.CreateCalculator().Add(1,2);

или

int result = IChannelFactory<ICalculator>().CreateChannel().Add(1,2);

в зависимости от того, было ли оно локальным или удаленным.

Это плохая практика для вызоваКод, аннотированный WCF напрямую (т. Е. Без использования WCF)?

Дополнительные комментарии:

  • Я понимаю, что мог бы использовать WCF во всех случаях и просто разместить службу, используя NamedPipes для локальных соединений,Я хотел бы избежать этого, если я могу для простоты.
  • Альтернативой вышеупомянутому является существенное дублирование интерфейса ICalculator в библиотеке служб и изменение реализации службы WCF, чтобы она содержала CalculatorFactory.CreateCalculator (). Add(1,2).Это похоже на большие издержки, учитывая, что я хочу, чтобы интерфейс был таким же.

1 Ответ

2 голосов
/ 24 апреля 2011

Вы можете создавать и использовать аннотированные классы WCF локально без каких-либо проблем, если только вы не начнете использовать некоторые связанные с WCF функции, такие как OperationContext и т. Д.

Обычно это обычно абстрагируется по-разному:

Клиент => ServiceAgent => Бизнес-сервис

или

Client => ServiceAgent => WCF Service => Бизнес-сервис

Клиент сам не знает, является ли служба локальной удаленной. Агент службы является клиентским компонентом, который на основе своей реализации создает локальный экземпляр службы или удаленную службу WCF callse, которая, в свою очередь, создает экземпляр бизнес-службы. ServiceAgent может быть введен в качестве зависимости в клиент, что сделает ваше приложение достаточно хорошо настраиваемым. Также вы можете предоставить другой интерфейс агенту службы (так же, как реализует бизнес-служба), и если вы хотите, чтобы служба WCF и прокси-сервер могли использовать разные.

Если вы решите использовать службу WCF все время, включая локальные вызовы, не используйте NamedPipes. NamedPipes предназначены для межпроцессного взаимодействия на одной машине. Если вы хотите использовать связь в том же процессе, используйте NullTransport или Локальный канал . Он все еще имеет худшую производительность, чем прямой вызов.

...