使用NHibernate创建数据库类库

时间:2013-04-30 11:26:36

标签: c#-4.0 nhibernate fluent-nhibernate fluent-nhibernate-mapping

我正在编写一个类库作为DataModel。 DataModel能够处理所有与数据库相关的任务。我正在使用NHibernate和Fluent NHibernate。

现在出现的问题如下:

  1. 我们是否应公开实体(POCO类)。
  2. 将具有内部受保护属性和属性的实体暴露为接口是否合适。
  3. 为映射创建的实体可以是WPF MVVM的模型。
  4. 或者我们应该直接绑定实体吗?
  5. 如果Library返回实体List作为API返回,则无法控制。所以任何人都可以在列表中添加或删除。我应该如何控制它。我应该创建从IList派生的代理,它将跟踪它。
  6. 在API中抛出异常是否正确,还是应该返回null?
  7. 继续登录图书馆好吗?

2 个答案:

答案 0 :(得分:1)

  

我们是否应公开实体(POCO类)。

是的,否则当没人使用时会使用实体

  

将具有内部受保护属性和属性的实体作为接口公开是否有用。

这取决于!使用ORM时,内部受保护的属性没有问题,但我更喜欢将内部资源减少到最小,因为我喜欢保持自己状态的对象。接口很好

  

为映射创建的实体可以是WPF MVVM的模型。

当然。无需再次复制它们。这是持久性无知的原因

  

或者我们应该直接绑定实体吗?

更多的是,UI要求与持久性/业务规则非常不同,因此将有针对UseCases / Views的专用ViewModel。但是,引入列表的简单数据持有者(如Order class)可以直接绑定(例如,使用DatabindingFactory使其实现INPC)

  

如果Library返回实体List作为API返回,则无法控制。所以任何人都可以在列表中添加或删除。我应该如何控制它。我应该创建从IList派生的代理,它将跟踪它。

列表只是在内存容器中。用户仍然需要通过API来保存/更新状态。

  

在API中抛出异常是否正确,或者我应该返回null

如果返回集合,那么空集合远远好于null。

然而,异常应该冒出来,最好包含在自己的可处理的异常中。实施NHibernate.Exceptions.ISQLExceptionConverter(例如NHibernate.Test.ExceptionsTest.MSSQLExceptionConverterExample)并使用例如config.DataBaseIntegration(db => db.ExceptionConverter<MyExceptionConverter>())进行配置 {{1}}

  

继续登录图书馆

是否合适?

是绝对。 Logging可以调试已部署的应用程序(流畅)NHibernate已经有很多内置的日志记录,如果可能的话。

答案 1 :(得分:1)

  

我们是否应公开实体(POCO类)。

是的,创建包装器类需要付出更多努力。

  

将具有内部受保护属性和属性的实体作为接口公开是否有用。

是的,Setter和非暴露属性是控制。

  

为映射创建的实体可以是WPF MVVM的模型。

对于原始类型可以,但引用可以通过接口公开。

  

或者我们应该直接绑定实体吗?。

如果创建了Model,则直接使用POCO对象。它对刷新案例更加灵活。如果取消操作,则用户无法更改POCO对象的属性。

  

如果Library返回实体List作为API返回,则无法控制。所以任何人都可以在列表中添加或删除。我应该如何控制它。我应该创建从IList派生的代理,它将跟踪它。

IEnumerable用于通过接口公开集合。

  

在API中抛出异常是否正确,还是应该返回null?

让用户了解错误会更好。但将异常包装在用户可读而非返回的NHibernate异常中。

  

继续登录图书馆

是否合适?

记录是了解问题的非常好的功能。