我正在开发的当前系统利用 Castle Activerecord 在域对象和数据库之间提供 ORM(对象关系映射)。这一切都很好,而且大多数时候实际上效果很好!
问题来自于 Castle Activerecords 对异步执行的支持,更具体地说,是管理对象所属会话的 SessionScope。长话短说,坏事发生了!
因此,我们正在寻找一种方法来轻松地将域对象(他们知道数据库存在并关心)转换(自动思考)到 DTO 对象(他们对数据库一无所知,不关心会话、映射属性或所有事情)奥姆)。
有没有人有这样做的建议。首先,我正在寻找对象的基本一对一映射。域对象Person将被映射到说PersonDTO。我不想手动执行此操作,因为它是一种浪费。
很明显,我想到了反思,但我希望这个网站周围有一些更好的 IT 知识, 会建议“更酷” 。
哦,我在 C# 中工作,如前所述的 ORM 对象与 Castle ActiveRecord 映射。
示例代码:
根据@ajmastrean 的要求,我已经链接到一个我(严重)一起嘲笑的例子。该示例有一个捕获表单、捕获表单控制器、域对象、活动记录存储库和一个异步助手。它有点大(3MB),因为我包含了运行它所需的 ActiveRecored dll。您需要在本地计算机上创建一个名为ActiveRecordAsync的数据库,或者只需更改 .config 文件。
示例的基本细节:
捕获表格
捕获表单有对控制器的引用
private CompanyCaptureController MyController { get; set; }
在初始化表单时,它调用 MyController.Load() private void InitForm () { MyController = new CompanyCaptureController(this); 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);
}
}
这就是“坏事”发生的地方,因为我们正在使用设置为延迟加载的 Company 的子列表。
控制器
控制器有一个从表单调用的 Load 方法,然后它调用 Asyc 助手以异步调用 LoadCompany 方法,然后返回 Capture 表单的 LoadComplete 方法。
public void Load ()
{
new AsyncListLoad<Company>().BeginLoad(LoadCompany, Form.LoadCompleted);
}
LoadCompany() 方法只是利用存储库来查找已知公司。
public Company LoadCompany()
{
return ActiveRecordRepository<Company>.Find(Setup.company.Identifier);
}
该示例的其余部分相当通用,它有两个继承自基类的域类、一个用于插入一些数据的设置文件和一个用于提供ActiveRecordMediator功能的存储库。