我们在域模型中使用nHibernate,并且希望创建DTO以通过WCF将对象发送到使用MVVM模式(WPF / WinForms)创建的前端应用程序。我们完全控制客户端和服务器 - 两者都同时升级,因此版本控制/跨平台不是问题。
我看到如何编辑单个条目,但是我仍然不确定通过网络发送对象集合的最佳方法。然后,DTO用于填充网格,其中可以更新,删除或添加行。
我的问题是;使用DTO和nHibernate在网格/表格场景中捕获插入,更新和删除的最佳方法是什么?
谢谢。
(我们的应用程序最初使用DataTables,其中DataTable / DataRow跟踪修改并使用GetChanges / Merge,您可以通过线路传输仅修改和需要更新的内容 - 其中插入和删除也很好地跟踪)< / p>
答案 0 :(得分:1)
我很可能会发送一个容器类,其中包含新的和更新的实例以及要删除的项目。
例如:
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控件。
答案 1 :(得分:0)
您需要绑定到BindingSource,例如:
dataGridView1.DataSource = _presenter.BindingSource;
您的View和Presenter之间也会有某种界面。
在您的演示者中,您将返回IList<NHibernateResult>
,其中NHibernateResult
是您所有要获取的属性的所有getter和setter的类。它可以是具有有限属性的自定义类(例如列)或您的实体类。 NHibernateResult不是一个实际的类,只是这个答案的占位符。
例如(在演示者中),
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和Respository(aka Model)交互。
这种抽象级别会从您的演示者中删除数据层,并使您的视图完全对模型完全愚蠢。它将您的视图降级为仅与UI相关的事件,例如Enabled,Visible,Colors等。