Castle Windsor和NHibernate - 为什么要使用它们?

时间:2016-02-02 11:52:59

标签: nhibernate castle-windsor

我刚刚获得了一份新工作,但他们正在使用Windsor,Castle Project(http://www.castleproject.org/)和NHibernate的一部分。我从来没有使用过,我现在正试图了解为什么会使用它们以及如何使用它们。

我已经阅读了这两个网站,但仍然无法解决为什么你想要与这些项目联系起来。 Castle现在似乎没有在2年内更新过。

任何人都可以解释您使用这两个项目的优势或原因吗?

感谢。

1 个答案:

答案 0 :(得分:1)

他们只是两个试图为您解决常见问题的图书馆。

<强> NHibernate的

NHibernate是一个ORM,一个对象关系映射库。在更改数据库中的表,将数据库迁移到不同的服务器类型或只是简单地查询数据库之后,对这些库的需求来自于长期的头痛历史。 NHibernate为您提取了许多特定于数据库的任务,让您处理标准的.Net对象(PO​​CO,普通的旧CLR对象)。你告诉NHibernate你需要一个Dogs的列表(狗在这种情况下是你的一个类,一个POCO代表你的应用程序中的狗及其属性)来自数据库有一些限制(比如#34;只有那些人超过10年&#34;)NHibernate为您创建查询。因为它还抽象了数据库类型,它可以为任何数量的受支持数据库创建查询 - MSSQL,MySQL,Oracle,Postgres或者NHibernate现在支持的任何其他数据。

ORM有它们的缺点,例如它们使特定查询的性能优化更加困难。如果你需要一个取决于你的情况。你最好看一些代码示例,看看你是否喜欢你所看到的。

Castle Windsor

当提到&#34; Castle&#34;时,人们大多指的是DI框架Castle WindsorCastle Windsor是DI(依赖注入)框架。 DI试图帮助您将组件彼此分离。无论出于何种原因,你可能都有相互依赖的课程。当您开始为某个组件编写测试时,这些依赖项会成为一个问题,因为要使组件正常工作,许多其他组件也必须工作。这可能意味着初始化数据库连接并在数据库上执行CRUD操作,这在单元测试中并不理想 - 您希望每次单元测试使用相同的输入,以便结果可重现。不断变化的数据库将是一件非常令人头疼的问题。

相反,您可以为每个组件创建接口,而让其他组件依赖于这些接口。现在class2不知道它取决于class1,而是取决于接口iClass1,并期望有一个实现iClass1的类实例的实例。这就是Castle所做的。 Castle可以在对象中注入依赖项。你告诉Castle你有接口iClass1并且它由class1实现,每当你有另一个组件取决于iClass1时,Castle将为该组件提供class1的实例。您可以微调Castle的工作方式(例如,重新使用实例,全局,每个线程或每个Web请求)。

在单元测试中,您现在可以模拟依赖项。您可以拥有一些小类补充数据并将其返回到您的组件,而不是为您的单元测试提供完整的数据库。在上面的示例中,不是让Castle为class1的每个依赖项提供iClass1,而是可以使用一个小的模拟类mockClass1来可靠地模仿class1将要做的事情。

您还可以通过更改Castle配置来简单地将一个组件与更新,更好的重新实现交换,而不是挖掘整个项目并交换从oldclass234muchbetterclass345的所有引用。

Castle ActiveRecord

Castle ActiveRecord是一个基本上扩展NHibernate的库。它在NHibernate中实现了ActiveRecord模式。因此,如果您想使用该模式,Castle ActiveRecord提供了许多功能,使您可以更轻松地完成该任务。

为什么要使用?

NHibernate,Castle Windsor(以及ActiveRecord)也为开发人员带来了一些开销。例如,NHibernate需要将对象映射到数据库表和字段。 Castle Windsor只有在你的组件分离时才有意义,这意味着你的项目中几乎每个组件都有接口。

通常,这些库(或类似的库,如其他ORM和DI框架选择都在那里)用于更大的项目,这些项目可以从这些工具提供的帮助中受益。如果您不必自己编写SQL查询,那么使用大量数据库表开发大型应用程序会更容易,特别是如果您还想为多个数据库提供支持。这并不意味着你不能在小项目中使用它们,但项目越大,你就越有可能在解决这些问题时获得一些经过验证的可靠帮助。