Пример создание iJaNet .NET Module на примере модуля-клиента с помощью iJaNet SDK.NET¶
Автор: Антон Сержантов
Компания: Janet systems
В данном примере будет создан модуль-клиент для вызова методов сервиса-калькулятора модуля, созданного в этом примере и развернутого на iJaNet Server.NET
Весь исходный код содержится в iJaNet Client Application.zip файле, прикрепленном к данной статье
Необходимое программное обеспечение:
- Microsoft .NET Framework v.2.0
- iJaNet SDK .NET не младше версии 5.4
- Клиент SVN, например Turtoise SVN
- Сборочная утилита NAnt
- 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, подробнее см. здесь .
В остальном, разработка модуля идентична разработке модуля-клиента.