Реализация стандартных интерфейсов

Расширение Консоли настройки, разрабатываемое для Модуля учета сетевых устройств, должно регистрировать клинский пакет установки, устанавливать новую библиотеку карточек, а также загружать в базу данных Docsvision заранее подготовленные данные карточек и справочников. Для этого в классе SnapIn должно быть реализовано несколько интерфейсов.

Реализация интерфейса ISnapIn

Основной интерфейс расширения, который добавляет:
  • LibraryID — идентификатор библиотеки карточек, с которой данное расширение ассоциировано. LibraryID требуется для регистрации пакетов установки, добавления библиотеки карточек в базу данных, удаления решения, а также для некоторых других сценариев работы Консоли настройки.

    public string LibraryID
    {
     get { return "{F729F178-15DA-4BDE-82B8-DD0B2F0C0BC6}"; }
    }
  • Name — название модуля. Используется в некоторых сервисных функциях, например: при отображении названия расширения в списке зарегистрированных расширений Консоли настройки.

    public string Name
    {
     get { return "Консоль управления модулем Проверка сети"; }
    }
  • Метод Initialize(IEnvironment) — позволяет получить переменные контекста работы Консоли настройки, которые предоставляют доступ к сервису регистрации пакетов установки клиентской части.

    public void Initialize(IEnvironment environment)
    {
     _environment = environment;
    }
  • Метод QueryInterface(SnapInInterfacesEnum) — возвращает пользовательский интерфейс, если он предусмотрен, для различных режимов работы Консоли настройки. Подробнее см. в разделе Модуль расширения Консоли настройки.

    public object QueryInterface(SnapInInterfacesEnum itf)
    {
     object result = null;
     switch (itf)
     {
      case SnapInInterfacesEnum.CONFIGURATOR:
      case SnapInInterfacesEnum.UNINSTALL_SNAP_IN:
      case SnapInInterfacesEnum.DB_INFORMATION:
       result = this;
       break;
    
      case SnapInInterfacesEnum.CONSOLE_CONTROL:
       result = new SnapInForm(); (1)
       break;
      }
     return result;
    }
    1 Экземпляр типа, реализующего пользовательский интерфейс.

Реализация интерфейса "IConfigurator"

Данный интерфейс должен быть реализован, если расширение может выполнять первоначальную настройку решения.

Как правило, метод Execute, при установке расширения вызываемый последним, регистрирует пакеты установки клиентской части, для чего указываются: путь к пакету установки, Идентификатор пакета установки и Код продукта, которые были указаны при разработке библиотеки карточек:

public bool Execute()
{
 ILog log = (ILog)_environment.QueryService(EnvironmentServiceEnum.LOG);

 ICardLibConfigurator2 cardLibConfig = (ICardLibConfigurator2)_environment.QueryService(EnvironmentServiceEnum.CARD_LIB_CONFIGURATOR); (1)

 (2)
 cardLibConfig.RegisterPackage(
  "E98E531F-D34C-41D6-9BCA-9972F46EB6DF", (3)
  "22CE4047-0BA8-4014-9BBE-7D8C43FDE907", (4)
  Path.Combine(AssemblyFolder, "NetstatSolutionClient.msi")); (5)

 log.WriteMessage("Конфигурирование завершено");

 return true; (6)
}
1 Регистрация клиентского пакета установки.
2 Регистрация пакета установки.
3 Идентификатор пакета установки.
4 Код продукта.
5 Абсолютный путь к пакету установки клиентской части.
6 Если метод должен сообщить об ошибке, то необходимо вызвать исключение. В обычном случает, метод возвращает true.

Реализация интерфейса "IDBInformation"

Данный интерфейс добавляет методы, предоставляющие Консоли настройки пути к CardPackage и SqlPackage.

Метод GetCardPackage должен вернуть абсолютный путь к пакету CardPackage:

public string GetCardPackage()
{
 return Path.Combine(AssemblyFolder, "CardPackage\\CardPackage.xml");
}

Метод GetScript(ScriptTypeEnum) должен вернуть абсолютный путь к пакету SqlPackage, если запрашивается тип ScriptTypeEnum.INSTALL_TABLES:

public string GetScript(ScriptTypeEnum type)
{
 string result = string.Empty;

 switch (type)
 {
  case ScriptTypeEnum.INSTALL_TABLES:
   result = Path.Combine(AssemblyFolder, "Database\\NetstatSolutionInstall.xml");
   break;
 }
 return result;
}

Также добавляется переменная ContainsCardLib, которая определяет наличие у решения собственной библиотеки карточек.

public bool ContainsCardLib
{
 get { return true; }
}

Реализация интерфейса IUninstallSnapIn

Данный интерфейс добавляет единственный метод Uninstall(Boolean), вызываемый при удалении расширения (и решения в целом).

Метод Uninstall может, к примеру, удалять библиотеку карточек, а также настройки решения, как в данном случае:

public void Uninstall(bool removeSettings)
{
 ILog log = (ILog)_environment.QueryService(EnvironmentServiceEnum.LOG);
 ICardLibConfigurator cardLibConfig = (ICardLibConfigurator)_environment.QueryService(EnvironmentServiceEnum.CARD_LIB_CONFIGURATOR);
 log.WriteMessage("Запущено удаление");

 cardLibConfig.RemoveCardLib(LibraryID); (1)

 if (removeSettings) (2)
 {
  using (RegistryKey key = Common.GetSubKey(Registry.LocalMachine, Common.NetstatSolutionKey))
  {
   key.DeleteValue(Common.EmailAdminRegName, false);
   key.DeleteValue(Common.CheckIsEnabledRegName, false);
   key.DeleteValue(Common.LicenseRegName, false);
  }
 }
 log.WriteMessage("Записи реестра удалены");
}
1 Удаление библиотеки карточек.
2 Удаление настроек модуля.