我们在我们的域模型中使用nHibernate,并希望创建DTO,用于通过WCF将对象发送到使用MVVM模式(WPF/WinForms)的前端应用程序。我们完全控制着客户端和服务器端--两者同时升级,所以版本控制/跨平台不是问题。
我知道编辑单个条目是如何工作的,但是我仍然不确定通过网络发送对象集合的最佳方式。DTO然后用于填充网格,可以在其中更新、删除或添加行。
我的问题是:在类似网格/表的场景中,使用DTO和nHibernate捕获插入、更新和删除的最佳方法是什么?
谢谢。
发布于 2010-08-24 19:11:44
我很可能会发送一个容器类,其中包含新的和更新的实例以及要删除的项。
例如:
class GridModificationsDto
{
Dto[] NewOrUpdatedItems { get; set; }
Identity[] DeletedItems { get; set; }
}当一个项目是新的时,它没有id。你也可以为新项目建立一个单独的列表。
然后你需要这样做:
foreach(Dto dto in modifications.NewOrUpdatedItems)
{
if (dto.id == 0)
{
session.Save(DtoMapper.CreateEntity(dto));
}
else
{
Entity entity = session.Get<Entity>(dto.id);
DtoMapper.Update(entity, dto);
}
}
foreach(Identity identity in modifications.DeletedItems)
{
session.Delete<Entity>(identity.id);
}我不知道您如何在ui中获取已修改项目的列表。我认为这可以通过数据绑定和PropertyChanged事件之类的东西来实现。如果没有任何有用的东西,你可能需要继承你自己的Grid控件。
发布于 2010-08-19 21:31:14
您需要绑定到BindingSource,如下所示:
dataGridView1.DataSource = _presenter.BindingSource;你还将在你的视图和演示者之间建立一个接口。
在您的展示器中,您将返回一个IList<NHibernateResult>,其中NHibernateResult是包含您要返回的属性的所有getter和setter的类。它可以是一个具有有限属性(例如列)的自定义类,也可以是您的实体类。NHibernateResult不是一个实际的类,只是这个答案的一个占位符。
例如(在presenter中),
private IList<OrdersResult> _bindingSource;
public IList<OrdersResult> BindingSource
{
get
{
//_bindingSource = OrderDataControl.Instance.GetAll();
_bindingSource =
OrderDataControl.Instance.GetSimpleOrderList(_firstResult, _maxResult);
return _bindingSource;
}
set
{
_bindingSource = value;
}
}OrderDataControl是数据访问对象或数据传输对象。它与您的SessionProvider和存储库(也称为模型)进行交互。
这种级别的抽象从您的presenter中移除了数据层,并使您的视图对模型完全无能为力。它将您的视图降级为仅与UI相关的事件,如启用、可见、颜色等。
https://stackoverflow.com/questions/3519118
复制相似问题