GuilhermeCoollink Ответов: 1

C# как динамически обновлять интерфейсы во время выполнения?


У меня есть служба WCF с этим интерфейсом:
[ServiceContract]
interface IServiceA
{
     [OperationContract]
     int Add(int value1, int value2);

     [OperationContract]
     int Subtract(int value1, int value2);
}


Затем, на другом сервисе, я буду общаться с ним через ChannelFactory
class ControllerService
{
     static string address = String.Format("net.tcp://localhost:8733/TestingService/Service");

     static void Main(string[] args)
     {
          while (true)
          {
               try
               {
                    ChannelFactory<IServiceA> factory = new ChannelFactory<IServiceA>(new NetTcpBinding());
                    IServiceA proxy = factory.CreateChannel(new EndpointAddress(address));
                    Console.WriteLine(proxy.Add(1 , 2));
               }
               catch (Exception ex)
               {
                    Console.WriteLine("Was not possible to run the service: " + ex);
               }
          }
     }
}


Эти две службы работают независимо. Проблема в том, что на ControllerService я должен заранее знать интерфейс, чтобы общаться с IServiceA.
Если IServiceA переходит в автономный режим, обновляется новыми методами в интерфейсе, как я могу обновить свой ControllerService, чтобы распознать новые методы и вызвать их динамически, не выключая ControllerService?

Что я уже пробовал:

Я пробовал работать с динамическими объектами через ExpandoObject, я пробовал использовать отражение во время выполнения, которое я действительно могу создавать классы и объекты и определять новые методы все это во время выполнения. Я просто не смог сделать то же самое для интерфейсов...

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

Другое" решение", которое я нашел, состояло в том, чтобы иметь всегда один и тот же интерфейс для связи между сервисами, эта связь была бы IServiceA информирует, какие методы у нее есть, А ControllerService в основном связывается с I want you to execute the method" X", и он возвращал бы ответ таким же образом.

1 Ответов

Рейтинг:
0

F-ES Sitecore

Интерфейс-это контракт, и если он может изменяться динамически, то это не контракт. И как вообще можно вызывать методы динамически? Допустим, я добавляю merthod называется "AddPersonToDivision", который принимает объект Person с firstName и lastName и т. д. и деления объект, который содержит такие поля, как "DivisionName", "DivisionManager", который является экземпляром "менеджер", который является классом, производным от человека. Как вы собираетесь назвать это динамично?

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


GuilhermeCoollink

Я могу создавать объекты, классы и все такое с помощью dyanmic objects и reflection in runtime. Я надеялся, что смогу создавать или обновлять интерфейсы таким же образом.