Пример создание iJaNet .NET Module на примере модуля-клиента с помощью iJaNet SDK.NET

Автор: Антон Сержантов
Компания: Janet systems

В данном примере будет создан модуль-клиент для вызова методов сервиса-калькулятора модуля, созданного в этом примере и развернутого на iJaNet Server.NET

Весь исходный код содержится в iJaNet Client Application.zip файле, прикрепленном к данной статье

Необходимое программное обеспечение:

  1. Microsoft .NET Framework v.2.0
  2. iJaNet SDK .NET не младше версии 5.4
  3. Клиент SVN, например Turtoise SVN
  4. Сборочная утилита NAnt
  5. Microsoft Visual Studio версии не младше 2008

Подготовка

Для начала необходимо выделить рабочую директорию, скачать iJaNEt SDK .NET архив, распаковать его во временную директорию и скопировать из нее папку iJaNet Client Application, содержащей проект-шаблон для MS Visual Studio для win-приложений. О том какова структура проектов iJaNet SDK .NET, какие файлы в нее входят и для чего они нужны можно посмотреть здесь .

Разработка.

По сути, шаблон проекта уже содержит все необходимое для начала, непосредственно, написания кода клиентского приложения, которое будет вызывать какие-то методы каких-то сервисов: в нашем случае это калькулятор-сервис модуля, развернутого на iJaNet Server.NET. Однако, здесь есть один момент, который стоит подчеркнуть:

Шаблонный проект iJaNet SDK .NET содержит библиотеку iJaNet .NET Framework janet-core.dll и ссылку на нее в References. Однако, для того, чтобы вызвать какой-либо сервис, нам необходимо ссылаться на интерфейс этого сервиса. Но, сборка, содержащая API интерфейса сервиса (в нашем случае это сборка CalcModule.Interface.dll, содержащая ICalcModule интерфейс), также ссылается на janet-core.dll и скорее всего, в общем случае, другой версии, чем та, которая входит в состав iJaNet SDK .NET. Поэтому, при разработке надо учитывать этот факт и использовать везде только одну, централизованную версию janet-core.dll или ту, которая идет вместе со сборкой интерфейса сервиса.

Итак, наше предложение, представляет собой простую win-форму:

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

 1       private void button1_Click(object sender, System.EventArgs e)
 2       {
 3          ICalcService calcSvc = null;
 4          try
 5          {
 6             calcSvc = (ICalcService) Services.GetService("Calculator");
 7 
 8             int a = Int32.Parse(this.maskedTextBox1.Text);
 9             int b = Int32.Parse(this.maskedTextBox2.Text);
10 
11             switch (((Operator) this.comboBox1.SelectedItem).Id)
12             {
13                case Opers.Add:
14                   this.textBox3.Text = calcSvc.Add(a, b).ToString();
15                   break;
16                case Opers.Sub:
17                   this.textBox3.Text = calcSvc.Sub(a, b).ToString();
18                   break;
19                case Opers.Mult:
20                   this.textBox3.Text = calcSvc.Mult(a, b).ToString();
21                   break;
22                case Opers.Div:
23                   this.textBox3.Text = calcSvc.Div(a, b).ToString();
24                   break;
25                default:
26                   throw new ArgumentOutOfRangeException();
27             }
28          }
29          catch (Exception ex)
30          {
31             Console.WriteLine(ex.StackTrace);
32          }
33          finally
34          {
35             if (calcSvc != null)
36             {
37                calcSvc.close();
38             }
39          }
40       }

Как видно из кода, сначала поднимается прокси-объект на калькулятор-сервис по имени "Calculator" (см. далее конфигурирование). А далее, в зависимости от того, какой оператор выбрал пользователь, вызывается соответствующий метод сервиса с передачей ему двух введенных пользователем чисел. Следует отметить, что после того, как код отработал с сервисом его необходимо "закрыть" вызвав метод close(). Поэтому, удобна конструкция try{...} finally{...}, где в try блоке идет работа с сервисом, а в finally его "закрытие".

Конфигурирование

Как и любой iJaNet модуль, данный также нуждается в наличии конфигурационного файла janet-module.xml, описывающем (в нашем случае) лишь только необходимую информацию по подключению к модулю содержащему калькулятор-сервис:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 
 3    <janet-module xmlns="http://ijanet.org/schema" 
 4               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 5               xsi:schemaLocation="http://ijanet.org/schema http://ijanet.org/schema/janet-module.xsd">
 6 
 7    <!-- It does not matter what exactly name iJaNet Client module has-->
 8    <module-name>Client</module-name>
 9 
10    <!-- Module-wide configuration parameters -->
11    <module-properties>
12       <param name="transport.compress" type="boolean">false</param>
13       <param name="transport.compressionLevel" type="int">9</param>
14       <param name="transport.encrypt" type="boolean">false</param>
15       <param name="transport.encryptionPassword" type="string">secret</param>
16    </module-properties>
17 
18    <!-- Section that describes locally deployed services -->
19    <!-- The client module should not declare local services-->
20    <local-services />
21 
22    <!-- Reference to other iJaNet module. This section can be repeated some times -->
23    <remote-module-ref>
24       <!--The transport section specifies how to call services of another module-->
25       <transport>
26          <transport-name>http</transport-name>
27          <parameters>
28             <!--This url is for iJaNet .Net modules. MODULE_FOLDER is actually module name, because
29             for these module (deployed on the iJaNet Server .NET) the module folder name must be equal to
30             module name-->
31             <param name="transport.http.url" type="string">http://localhost:8881/CalcModule</param>
32             <param name="transport.compress" type="boolean">false</param>
33             <param name="transport.encrypt" type="boolean">false</param>
34          </parameters>
35 
36       </transport>
37 
38       <service-proxy local-name="Calculator" remote-name="CalcService">
39          <service-interface>CalcModule.Interface.ICalcService</service-interface>
40       </service-proxy>
41    </remote-module-ref>
42 
43    <!-- Section that configures scheduled jobs. A iJaNet module configuration file can contain only 
44    one such section-->
45    <scheduled-jobs/>
46 </janet-module>
Отметим, что файл janet-module.xml входит в поставку iJaNet SDK. NET и содержит шаблон с комментариями, который упрощает написание конфигурационной информации в ручную.
Из конфигурационного файла отметим несколько моментов:
  • Т.к. это клиентское приложение, то имя модуля <module-name>, свойства модуля <module-properties> - не важны, т.к. содержат необходимую информацию для развертывания модуля и для подключения других модулей к конфигурируемому. Также клиентское приложение не должно декларировать локальные службы, т.к. оно может только вызывать другие.
  • В разделе <remote-module-ref> указана информацию по подключение к модуля, развернутому на iJaNet Server.NET и содержащему наш калькулятор-сервис. Заметим, что в строке подключения четко прописывает IP и порт, которые прослушивает сервер, а также имя модуля, которое совпадает с именем директории, в которую разворачивается модуль.
  • Также необходимо отметить, что в разделе параметров транспорта должны быть указаны такие же значение компрессии и шифрования, которые указаны в свойствах модуля, к которому происходит подключение
  • В описании прокси сервиса-калькулятора необходимо отметить, что remote-name это имя сервиса, которое указано в конфигурационном файле удаленного модуля. local-name - это имя, по которому в коде приложения мы сможем получить объект сервиса-прокси (см. код обработчика события нажатия кнопки выше). Также в конфигурации прокси указывается полное имя интерфейса сервиса. Вот почему, лучше API интерфейса сервиса и его реализацию разносить в разные сборки.

Сборка и отладка

Сборку и отладку модуля можно осуществлять с помощью непосредственно MS Visual Studio. Также в комплект iJaNet SDK .NET входит сборочный NAnt-скрипт (build.build), который собирает данный модуль под MS .NET Framework 2.0 и копирует в папку вывода конфигурационный файл.

Шаблон iJaNet Module

Другой шаблон, который входит в состав iJaNet SDK .NET, содержит проект-шаблон для iJaNet .NET модуля, который будет развернут. Отметим: что для модулей, разворачиваемых на iJaNet Server .NET папка lib, содержащая сборки iJaNet .NET Framework, должна содержать сборка iJaNet Server .NET SDK, подробнее см. здесь .
В остальном, разработка модуля идентична разработке модуля-клиента.

iJaNet_Client_Application.zip - Исходный код примера (255.2 KB) Антон Сержантов, 12/20/2010 10:21 pm

ClientApp_Form.png (22.5 KB) Антон Сержантов, 12/20/2010 10:41 pm

Also available in: HTML TXT