Текущая система, над которой я работаю, использует Castle Activerecord для предоставления ORM (реляционное сопоставление объектов) между объектами Domain и базой данных. Это хорошо, хорошо и в большинстве случаев работает хорошо!
Проблема возникает с поддержкой Castle Activerecords для асинхронного выполнения, а точнее, SessionScope, который управляет сеансом, к которому принадлежат объекты. Короче говоря, плохие вещи случаются!
Поэтому мы ищем способ легко конвертировать (думать автоматически) из объектов домена (которые знают, что БД существует и заботится) для объекта DTO (которые ничего не знают о БД и не заботятся о сеансах, атрибутах сопоставления или все вещи ORM).
Есть ли у кого-нибудь предложения по этому поводу. Для начала я ищу базовое отображение объекта One to One. Объект домена Лицо будет отображаться как PersonDTO. Я не хочу делать это вручную, так как это отходы.
Очевидно, что на ум приходит отражение, но я надеюсь, что некоторые из лучших ИТ-знаний будут перемещаться вокруг этого сайта, что будет предложено "кулер".
О, я работаю в С#, объектах ORM, как сказано перед сопоставлением с Castle ActiveRecord.
Пример кода:
По запросу @ajmastrean у меня ссылка на пример, который я (плохо) издевался вместе. В примере есть форма захвата,
, , домен, активный реестр и async. Он немного большой (3 МБ), потому что я включил DLL ActiveRecored, необходимый для его запуска. Вам нужно будет создать базу данных под названием ActiveRecordAsync на вашем локальном компьютере или просто изменить файл .config.Основные сведения о примере:
Форма захвата
Форма захвата имеет ссылку на contoller
private CompanyCaptureController MyController { get; set; }
При инициализации формы он вызывает MyController.Load() private void InitForm() { MyController = новый CompanyCaptureController (это); MyController.Load(); } Это вернет обратно к методу 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);
}
}
здесь происходит "плохой материал", так как мы используем дочерний список компании, который настроен как "ленивая" загрузка.
Контроллер
У контроллера есть метод 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.