WCF - поиск наилучшей практики при наличии нескольких контрактов с общими методами - PullRequest
5 голосов
/ 07 апреля 2011

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

void Method_A();
void Method_B();
void Method_X1();

выставить одному типу клиентов (модуль "X1") и:

void Method_A();
void Method_B();
void Method_X2();

выставить другим типам клиентов (модуль "X2") и зная, что Method_A и Method_B должны иметь точную реализацию ... тогда как я могу наилучшим образом спроектировать архитектуру сервисов (с точки зрения услуги и контракты)?

Есть ли шанс реализовать Method_A и Method_B ​​только один раз (не 2 раза в разных реализациях контракта)?

Какую пользу я получу от наследования интерфейса при использовании WCF?

Спасибо всем заранее, и, пожалуйста, дайте мне знать, если мне нужно сделать это более ясным!

@ marc_s ... Буду очень признателен за вашу точку зрения ...

Ответы [ 2 ]

3 голосов
/ 07 апреля 2011

Классы могут наследовать методы, которые удовлетворяют интерфейсу, поэтому вы можете иметь интерфейс IServiceBase и класс ServiceBase, который просто реализует Method_A и Method_B, а затем выделять уникальные методы в отдельные интерфейсы, в конечном итоге объединяя они вместе в классах, которые наследуют ServiceBase и реализуют либо Interface1, либо Interface2. например:

[ServiceContract]
public interface IServiceBase
{
    [OperationContract]
    void Method_A();

    [OperationContract]
    void Method_B();
}

[ServiceContract]
public interface IService1 : IServiceBase
{
    [OperationContract]
    void Method_X1();
}

[ServiceContract]
public interface IService2 : IServiceBase
{
    [OperationContract]
    void Method_X2();
}

public abstract class ServiceBase : IServiceBase
{
    void Method_A()
    {
        ... implementation here ...
    }

    void Method_B()
    {
        ... implementation here ...
    }
}

public class Service1 : ServiceBase, IService1
{
    void Method_X1()
    {
        ... implementation here ...
    }
}

public class Service2 : ServiceBase, IService2
{
    void Method_X2()
    {
        ... implementation here ...
    }
}
2 голосов
/ 07 апреля 2011

Мне позвонили!?!?!:-)

Если у вас есть один интерфейс

public interface IServiceA
{
  void Method_A();
  void Method_B();
  void Method_X1();
}

и второй

public interface IServiceB
{
  void Method_A();
  void Method_B();
  void Method_X2();
}

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

Вы бы создали два класса MethodAHandler и MethodBHandler на своем сервере, в общей библиотеке классов (или в двух отдельных общих сборках), а затем могли бы использовать что-то вроде:

using MethodHandlers;  // contains the two method handlers

public class ServiceA : IServiceA
{
   public void Method_A()
   {
       MethodAHandler hnd = new MethodAHandler();
       hnd.HandleMethodCall();
   }

   public void Method_B()
   {
       MethodBHandler hnd = new MethodBHandler();
       hnd.HandleMethodCall();
   }

   public void Method_X1()
   {
       // handle method X1 call here or delegate to another handler class
   }
}

и для второго сервиса:

using MethodHandlers;  // contains the two method handlers

public class ServiceB : IServiceB
{
   public void Method_A()
   {
       MethodAHandler hnd = new MethodAHandler();
       hnd.HandleMethodCall();
   }

   public void Method_B()
   {
       MethodBHandler hnd = new MethodBHandler();
       hnd.HandleMethodCall();
   }

   public void Method_X2()
   {
       // handle method X2 call here or delegate to another handler class
   }
}

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

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