Текущая система, над которой я работаю, использует Castle Activerecord для обеспечения ORM (реляционного сопоставления объектов) между объектами домена и базой данных. Это все хорошо и хорошо, и в большинстве случаев действительно работает хорошо!
Проблема возникает из-за поддержки Castle Activerecords асинхронного выполнения, точнее, SessionScope, который управляет сеансом, к которому принадлежат объекты. Короче говоря, плохие вещи случаются!
Поэтому мы ищем способ легко преобразовать (мыслить автоматически) из объектов предметной области (которые знают, что БД существует и им не все равно) в объект DTO (которые ничего не знают о БД и не заботятся о сеансах, сопоставлении атрибутов или обо всем остальном). ОРМ).
У кого-нибудь есть предложения по этому поводу. Для начала я ищу базовое сопоставление объекта «один к одному». Объект домена Person будет сопоставлен с PersonDTO. Я не хочу делать это вручную, так как это пустая трата времени.
Очевидно, что на ум приходит размышление, но я надеюсь, что некоторые из лучших знаний в области ИТ, размещенные на этом сайте, будут предложены "круче".
О, я работаю на C#, объекты ORM, как было сказано ранее, отображаются с помощью Castle ActiveRecord.
Пример кода:
По просьбе @ajmastrean у меня есть ссылка на пример, над которым я (плохо) издевался вместе. В примере есть форма захвата, форма захвата контроллер, объекты домен, активная запись репозиторий и асинхронный помощник. Он немного большой (3 МБ), потому что я включил DLL ActiveRecored, необходимые для его работы. Вам потребуется создать базу данных с именем ActiveRecordAsync на локальном компьютере или просто изменить файл .config.
Основные детали примера:
Форма захвата
Форма захвата имеет ссылку на контроллер
private CompanyCaptureController MyController { get; set; }
При инициализации формы вызывается MyController.Load() private void InitForm () { MyController = new CompanyCaptureController(this); МойКонтроллер.Загрузить(); } Это вернет метод LoadComplete().
public void LoadCompleted (Company loadCompany)
{
_context.Post(delegate
{
CurrentItem = loadCompany;
bindingSource.DataSource = CurrentItem;
bindingSource.ResetCurrentItem();
//TOTO: This line will thow the exception since the session scope used to fetch loadCompany is now gone.
grdEmployees.DataSource = loadCompany.Employees;
}, null);
}
}
здесь возникают "плохие вещи", так как мы используем дочерний список Company, который установлен как отложенная загрузка.
Контроллер
Контроллер имеет метод Load, который был вызван из формы, затем он вызывает помощник Asyc для асинхронного вызова метода LoadCompany, а затем возвращается к методу LoadComplete формы Capture.
public void Load ()
{
new AsyncListLoad<Company>().BeginLoad(LoadCompany, Form.LoadCompleted);
}
Метод LoadCompany() просто использует репозиторий для поиска известной компании.
public Company LoadCompany()
{
return ActiveRecordRepository<Company>.Find(Setup.company.Identifier);
}
Остальная часть примера довольно общая, в нем есть два доменных класса, которые наследуются от базового класса, установочный файл для вставки некоторых данных и репозиторий для предоставления возможностей ActiveRecordMediator.