[AttributeUsage(AttributeTargets.Method)]
public class ThrowableAttribute : Attribute
{
}
void BtnCreate_Click(object? sender, EventArgs e)
{
/// Получаю интерфейсную ссылку на экземпляр формы. Для этого передаю
/// в метод ссылку на вью-модель (_ctx). Конечно, я мог бы во все вью-
/// модели запихнуть логику получения форм, но это бы грубо нарушило
/// принцип единой ответственности для вью-моделей.
using IDependableForm form = FormsFactory.GetCreateForm(_ctx);
/// Подписываюсь на событие закрытия формы, чтобы определенным
/// образом изменить состояние компонента.
form.OnFormClosing += DependableForm_Closing;
/// Показываю форму модально, чтобы не усложнять приложение попыткой
/// отследить родителя.
form.ShowAsModal();
}
SELECT 23/3;
void InputContainerFormControl_Disposed(object? sender, EventArgs e)
{
if (_ctx != null)
{
_ctx.FormContextChangedByUser -= Ctx_FormContextChangedByUser;
}
}
yum install perl
dnf --enablerepo=ol9_codeready_builder install perl-IPC-Run
yum install postgresql15-contrib
[root@pg-dev pgtap-1.2.0]# yum install postgresql14-devel
Last metadata expiration check: 15:53:08 ago on Thu Apr 27 00:40:38 2023.
Package postgresql14-devel-14.7-1PGDG.rhel9.x86_64 is already installed.
Dependencies resolved.
Nothing to do.
Complete!
[root@pg-dev pgtap-1.2.0]# yum install postgresql15-devel
Last metadata expiration check: 15:53:19 ago on Thu Apr 27 00:40:38 2023.
Error:
Problem: cannot install the best candidate for the job
- nothing provides perl(IPC::Run) needed by postgresql15-devel-15.2-1PGDG.rhel9.x86_64
(try to add '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages)
[root@pg-dev pgtap-1.2.0]#
public static GuiViewObject GetViewInfo(int id) {...}
// Потребителем этой переменной является только обработчик клика, поэтому не важно, что кеш подвисает в случае клика за пределами ячейки
int? _idCache;
void GridControl_CellMouseDown(object? sender, DataGridViewCellMouseEventArgs e)
{
_idCache = null;
_gridControl.CurrentCell = _gridControl[e.ColumnIndex, e.RowIndex];
var idCell = _gridControl.CurrentRow.Cells[AppSettings.IdColumnName];
_idCache = idCell.Value == DBNull.Value ? null : (int)idCell.Value;
if (_idCache.HasValue)
{
_openMenuItem.Visible = true;
_openMenuItem.Click -= Open_Click;
_openMenuItem.Click += Open_Click;
}
}
// Открываем форму
void Open_Click(object? sender, EventArgs e)
{
App.ShowDataRecordForm(_dataDomainName, _idCache);
}
Хорошо, я создам класс команды и помещу его в контейнер, передав зависимость от сервиса этикеток через конструктор (возможно DI сам будет инициализировать):
Но как быть с визуальными компонентами? Например, у меня в Lib.Controls есть форма, а не ней кнопка, по которой должна вызываться данная команда. Как же я смогу извлечь для нее команду из контейнера, если библиотека ничего не знает о DI, который собран на стороне приложения?
Я планировал преобразовать фабрику CommonControls в сервис команд, инициализировать этот сервис в корне и так же поместить в DI, а затем, в библиотеке, получать ссылку на нужную команду таким образом:
То есть библиотеке в любом случае нужен ApplicationHost или что-то в этом роде.
Или ты предлагаешь еще и все визуальные компоненты запихнуть в DI? Теоретически это возможно, если создать для каждого из них отдельный конструктор, куда будут передаваться все нужные зависимости и тогда биндинг будет выполняться к самому классу компонента.
Но это выглядит громоздко... Я действительно хочу понять, как можно (и стоит ли) избавляться от передачи зависимостей через ApplicationHost.