什么时候使用其中一种工具不利于另一种工具的共识是什么?我发现Subsonic在快速完成工作方面非常有用,但是在大型项目中,它往往无法扩展,并且将您的域模型与数据库模型联系在一起。这就是Nhibernate出现的地方,因为它为您提供了与数据库模型无关的轻量级POCO,但是建立时间更长。
Answers:
我经常被问到这个问题,实际上归结为您想花多少钱。我无法告诉您Chris Cyvas的评论RE SubSonic缩放的破坏性如何-自从:(。
这笔交易是明智的,SubSonic的扩展性非常好。就项目增长而言-您使用的任何工具都需要引起您的注意。甚至NHibernate。
我写了一篇关于如何在SubSonic 2.1中将存储库模式用于DI(就像使用NHIb或其他工具一样)的文章:
http://blog.wekeroad.com/blog/subsonic-writing-decoupled-testable-code-with-subsonic-2-1/
我还写了一篇有关SubSOnic性能的文章:
http://blog.wekeroad.com/blog/subsonic-scaling/
希望这可以帮助。
稍微偏离主题,但类似。您是否看过Castle ActiveRecord,它是在NHibernate之上编写的,因此无需花费时间来创建从代码到数据库的XML映射。像NHibernate一样,您可以根据需要构造域对象,然后从该结构生成数据库架构。
使用 ActiveWriter(一种辅助工具),您可以轻松地从数据库映射到域对象。
您可以考虑使用Fluent NHibernate。它使NHibernate的管理变得轻而易举。不确定转换现有模式会有多困难,但是如果要构建新的应用程序,最好定义域模型并在您能想到的几乎所有DB服务器中生成数据库。通过阅读这里的其他评论,我认为Fluent NHibernate可以将NHibernate与SubSonic相提并论,以便于配置。
我对两者都进行了评估,我认为在不了解您的目标的情况下建议彼此推荐是不公平的。在您的问题中,您很好地说明了差异,我认为这是您的决定因素。我个人已经使用了这两种方法,并将根据项目继续使用这两种方法。
还是有点题外话,但是我将第二次使用Castle ActiveRecord-而不是使用数据库作为您的模型(Subsonic方法)或花费数小时的XML意大利面条(NHibernate方法),您只需在模型类上放置属性即可。
您甚至可以让ActiveRecord为您生成数据库架构。
现在,我们已经在许多项目上使用了这种方法,其好处如下:
我们处于亚音速之路,现在我们正尝试评估是否正处于亚音速的痛点,因此是否要切换到休眠状态。
我们的另一种选择是创建一个中间立场,在这里我们可以使用subsonic来查询和加载具有“作为类型列表执行”功能的任意对象,这些功能可以根据任意linq样式的sql语句进行基于名称的映射。或者尝试在休眠状态下重新创建其中的一部分,然后重构其余部分。
因此,我说亚音速在小型应用程序中是有意义的,但亚音速应用程序的维护工作非常繁琐,验证代码重叠以及在代码触发事件之前/之后我们尤其困难。对于活动记录模式,subsonic肯定在那里占80%,但是以一种不可靠的方式进行操作,并且使您无法真正控制继承层次结构,因为每个类都必须继承一个表才能返回该表。
拥抱阻抗不匹配!
:)
还是不要。如果您想要性能,请自己做。如果您想快速简便地使用NHibernate和ActiveRecord。如果您想假装自己实际上知道数据访问级别上发生了什么,请使用NHibernate并整天坐在XML上,以实现很多对很多...或者只是...错误..自己动手做-ADO.Net FTW!
我相信您应该坚持使用最好的方法。最终目标是提高生产效率和提供良好的质量代码。如果您知道SubSonic的进进出出,则请坚持下去,如果您知道NHibernate的深度,请坚持使用NHibernate。这是一个非常主观的问题。您还应该考虑一个事实,即您的团队成员具有专业知识。如果您擅长于此,则可以轻松进行维护。
我已经看到了使用SubSonic的大型项目,而NHibernate已经很出名并且被广泛使用。
选择ORM的决定 不仅仅取决于ORM本身。
我得到的关于该主题的建议是Subsonic不能扩展以处理更复杂的场景,因此,如果走那条路,您最终将不得不尝试转换为更高级的ORM。
因此,我对在复杂情况下使用NHibernate,在简单情况下使用Castle Active Record更加感兴趣,并且一直关注Fluent NHibernate,这应该使NHibernate映射更加容易(尤其是在改进了基于约定的映射支持之后)。