Пример работы механизма замещения

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

Создание замещаемого класса

  1. Откройте раздел «Конфигурация».
  2. Создайте пользовательский пакет BpmSubstitutionMechanism. В области работы с пакетами раздела «Конфигурация» выберите созданный пакет. В свойствах пакета в области «Зависит от пакетов» добавьте пакет ProductCore.
  3. Из списка «Добавить» панели инструментов рабочей области раздела «Конфигурация» выберите «Исходный код».

Рисунок 1 — Создание замещаемого класса

Рисунок 1 — Создание замещаемого класса

  1. Заполните свойства «Заголовок» и «Код»:

Рисунок 2 — Свойства замещаемого класса

Рисунок 2 — Свойства замещаемого класса

  1. Создайте класс BpmBaseCalculator. Добавьте один виртуальный метод, возвращающий сумму двух чисел, переданных в качестве параметра метода.
Код класса и метода
// Система позволяет использовать любое пространство имен в коде схемы «Исходный код».
// Выбор пространства имен зависит от команды разработки или регламентов компании.
// В данном пример воспользуемся пространством BPMSoft.Configuration. 
namespace BPMSoft.Configuration
{
	/// <summary>
	/// Замещаемый (базовый) класс.
	/// </summary>
	public class BpmBaseCalculator
	{
		/// <summary>
		/// Базовый виртуальный метод, который будет переопределен в замещающем классе. Метод возвращает сумму двух чисел.
		/// </summary>
		public virtual int GetAmount(int firstNumber, int secondNumber)
		{
			return firstNumber + secondNumber;
		}
	}
}
  1. Сохраните и опубликуйте схему.

Создание замещающего класса

  1. Откройте раздел «Конфигурация».
  2. Выберите пакет, в который хотите добавить замещающий класс. Обратите внимание на то, что замещаемый класс должен находится либо в том же пакете, что и замещающий, либо пакет с замещаемым классом должен быть добавлен как зависимый в пакет с замещающим классом. Сделать это можно через свойства пакета. В данном примере используется тот же пакет BpmSubstitutionMechanism.
  3. Из списка «Добавить» панели инструментов рабочей области раздела «Конфигурация» выберите «Исходный код».
  4. Заполните свойства «Заголовок» и «Код»:

Рисунок 3 — Свойства замещающего класса

Рисунок 3 — Свойства замещающего класса

  1. Создайте новый класс BpmCalculator, который наследуется базового класса BpmBaseCalculator. Добавьте атрибут Override перед определением класса. Добавьте поле целочисленное поле Rate. Переопределите метод GetAmount, как показано в примере кода.
Пример кода:
namespace BPMSoft.Configuration
{
	// В данном пространстве имен находится атрибут Override. 
	using BPMSoft.Core.Factories;
	
	/// <summary>
	/// Замещающий (производный) класс.
	/// </summary>
	
	// Атрибут Override указывается для построения дерева зависимостей замещающих и замещаемых типов.
	// Атрибут указывает на то, что данный класс являются замещающим.
	[Override]
	public class BpmCalculator : BpmBaseCalculator
	{
		/// <summary>
		/// Коэффициент.
		/// </summary>
		public virtual int Rate { get; private set; }
		
		/// <summary>
		/// Конструктор замещающего класса.
		/// </summary>
		public BpmCalculator(int rateValue)
		{
			Rate = rateValue;
		}
		
		/// <summary>
		/// Замещенный метод. Возвращает сумму двух чисел умноженную на коэффициент.
		/// </summary>
		public override int GetAmount(int firstNumber, int secondNumber)
		{
			return (firstNumber + secondNumber) * Rate;
		}
	}
}
  1. Сохраните и опубликуйте схему.

Демонстрация работы

Для вызова метода замещающего и замещаемого классов создадим пользовательский веб-сервис.

  1. Откройте раздел «Конфигурация».
  2. Выберите пакет, в который хотите добавить сервис. Обратите внимание на то, что сервис должен находиться в том же пакете, что и замещаемый, и замещающий класс. Если это не так, добавьте в пакет с сервисом необходимые зависимости. В данном примере используется тот же пакет BpmSubstitutionMechanism.
  3. Из списка «Добавить» панели инструментов рабочей области раздела «Конфигурация» выберите «Исходный код».
  4. Заполните свойства «Заголовок» и «Код»:

Рисунок 4 — Свойства веб-сервиса

Рисунок 4 — Свойства веб-сервиса

  1. Реализуйте Get-метод веб-сервиса, в котором вызывается метод подсчета замещаемого и замещающего классов.
Реализация Get-метода
namespace BPMSoft.Configuration
{
	using System.ServiceModel;
	using System.ServiceModel.Activation;
	using System.ServiceModel.Web;
	using BPMSoft.Web.Common;
	using BPMSoft.Core.Factories;
	using System;
	
	/// <summary>
	/// Пользовательский сервис.
	/// </summary>
	[ServiceContract]
	[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
	public class BpmAmountService : BaseService
	{
		/// <summary>
		/// Возвращает строку с результатом вызова методов GetAmount замещающего и замещаемого классов.
		/// </summary>
		[OperationContract]
		[WebGet(RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)]
		public string GetAmount(int firstNumber, int secondNumber)
		{
			try
			{
				/* Создание экземпляра замещаемого класса. */
				var bpmBaseCalculator = new BpmBaseCalculator();
				/* Создание экземпляра замещающего класса через фабрику замещаемых объектов. */
				var bpmCalculator = ClassFactory.Get<BpmBaseCalculator>(new ConstructorArgument("rateValue", 2));
				/* Получение результата работы метода GetAmount(). Будет вызван метод исходного класса BpmBaseCalculator без замещения. */
				int baseCalculatorResult = bpmBaseCalculator.GetAmount(firstNumber, secondNumber);
				/* Получение результата работы метода GetAmount(). Будет вызван метод класса BpmCalculator, который замещает BpmBaseCalculator. */
				int bpmCalculatorResult = bpmCalculator.GetAmount(firstNumber, secondNumber);
				/* Отображение на странице результата выполнения. */
				return string.Format("Результат замещаемого класса: {0}; Результат замещающего класса : {1}", baseCalculatorResult.ToString(), bpmCalculatorResult.ToString());
			}
			catch (Exception ex)
			{
				throw new Exception($"В пользовательском сервисе возникла ошибка:{ex} {ex.Message}");
			}
		}
	}
}
  1. Сохраните и опубликуйте схему.

Вызовите метод веб-сервиса из браузера. Для этого в адресную строку введите адрес:
[Адрес приложения]/0/rest/BpmAmountService/GetAmount?firstNumber=25&secondNumber=125, где

  • [Адрес приложения] — адрес сервиса;
  • BpmAmountService — название веб-сервиса;
  • GetAmount — название вызываемого метода;
  • firstNumber и secondNumber — параметры веб-сервиса.

В .NET 8 версии приложения для вызова веб-сервиса не нужно использовать приставку /0.

Рисунок 5 — Результат вызова

Рисунок 5 — Результат вызова

Ресурсы

Пакет с реализацией примера

Рекомендуем изучить

Пользовательские веб-сервисы

Материал был полезен для вас?
Заявка на индивидуальный тренинг
Заявка на обучение в формате тренинга
Заявка на консультацию по обучению
Готовы сделать выбор CRM? (детальная)
Оставьте заявку, и наши эксперты бесплатно проконсультируют вас, подберут подходящую конфигурацию и рассчитают стоимость проекта.
Предпочитаемый способ связи
Готовы сделать выбор CRM?
Оставьте заявку, и наши эксперты бесплатно проконсультируют вас, подберут подходящую конфигурацию и рассчитают стоимость проекта.
Предпочитаемый способ связи
Вебинар: 25 июня в 11:00
Приглашаем вас на вебинар: BPMSoft CRM без отраслевых границ. От трейдинга до здравоохранения. Опыт и цифры
Готовы сделать выбор CRM? (детальная)
Оставьте заявку, и наши эксперты бесплатно проконсультируют вас, подберут подходящую конфигурацию и рассчитают стоимость проекта.
Предпочитаемый способ связи
Готовы сделать выбор CRM?
Оставьте заявку, и наши эксперты бесплатно проконсультируют вас, подберут подходящую конфигурацию и рассчитают стоимость проекта.
Предпочитаемый способ связи
Регистрация на мероприятие
Оставить заявку
Оставьте свои контакты и наш менеджер свяжется с Вами в ближайшее время.
Предпочитаемый способ связи
Демонстрационная версия BPMSoft
Заполните заявку для получения бесплатного доступа к демонстрационному стенду на 14 дней.
Типовое внедрение
Внедрите BPMSoft CRM в свою компанию всего за 8 рабочих дней по фиксированной цене! Заполните заявку для уточнения условий.
Предпочитаемый способ связи
Заказать презентацию
Наш менеджер свяжется с Вами в ближайшее время.
Предпочитаемый способ связи
Рассчитать стоимость
Предпочитаемый способ связи
Лучшие CRM-системы в России: выводы Фонда «Сколково»
Какие CRM выбирают крупнейшие российские компании? Скачайте исследование рынка CRM-систем 2026 от Фонда «Сколково» и TAdviser
Задать вопрос
Предпочитаемый способ связи
Есть вопросы?
Не нашли для себя подходящую вакансию, или остались вопросы?
*
Есть вопросы?
Не нашли для себя подходящую вакансию, или остались вопросы?
*
Присоединяйтесь к партнерской сети BPMSoft
Оставьте свои контакты и наш менеджер свяжется с Вами в ближайшее время
Тип партнерства*
Управление полным жизненным циклом клиента: от генерации лидов и продаж до внедрения, поддержки и продления подписки.
Разработка собственного Приложения – производного программного обеспечения, созданного на платформе BPMSoft (Базовое ПО).
Заявка на онлайн-консультации по BPMSoft
Оставьте свои контакты и наш менеджер свяжется с Вами в ближайшее время
Стать образовательным партнёром
Оставьте свои контакты и наш менеджер свяжется с Вами в ближайшее время.
Заявка на консультацию
Оставьте свои контакты и наш менеджер свяжется с Вами в ближайшее время.
Подписка
Спасибо!
Ваша заявка принята.
Спасибо!
Ваша заявка принята.
Наш сотрудник свяжется с вами в течение 1-2 рабочих дней.
Внимание!
Обнаружена ошибка.
Проверьте вашу почту
Проверьте вашу почту
Для завершения подписки перейдите по ссылке в письме, которое мы только что отправили. Если письма нет во «Входящих», проверьте папку «Спам».
MAX Подписаться
Уважаемые клиенты! Предупреждаем о случаях недобросовестной конкуренции и мошенничестве в сети Интернет.
Подробнее