最近,我一直在研究一些Perl项目,而且我是一名非常新手的Perl程序员。我一直在尝试使用DBIx :: Class,到目前为止,我非常喜欢灵活性和易用性。我很好奇。我来自.NET背景,似乎我们花了很多时间在一定程度上抽象我们的DAL。这是一个像Perl这样的语言的好主意吗?
我想在短期内获得的是能够开始模拟我的DAL,以便我可以为任务编写单元测试。现在虽然我正在努力解决应用程序的整体结构和设计应该如何看待?
答案 0 :(得分:3)
Re:应用程序中ORM的关系...
希望这是你正在寻找的那种答案......
对于“脚本”世界中的大多数Web应用程序框架(即perl,ruby,python,php),大多数时候我都看到了在ORM对象级别实现的业务逻辑。例如。在Rails应用程序中,它处于ActiveRecord
级别;如果您使用的是DBix::Class
,那么它将处于Result
级别。
更具体地说,在DBIx::Class
的情况下,如果你有一个名为VENDOR
的表,那么会有一个名为MySchema::Result::Vendor
的类,它代表表{{1}中的一行}。只需将您的业务方法添加到此类。
这种方法的一个缺点是它将您的业务逻辑与ORM类联系起来,这可能使(单元)测试更加困难。对此的一个解决方案是使用轻量级数据库进行单元测试(即SQLite),像VENDOR
这样的ORM将有助于在两者之间进行切换。当然,如果您依赖SQLite中未实现的SQL功能,这将不起作用。
另一种方法是将业务逻辑方法置于Moose角色。然后,这些方法可以组成DBIx :: Class Result类或模拟对象进行测试。如果您愿意,我可以举例说明。
上述一个重要的假设是您的业务对象=数据库中的一行。如果不是这种情况(即您的业务对象跨越多个表),那么您可能希望创建一个“shell”或容器对象,其中包含每个组成ORM对象的实例成员。幸运的是,Moose有一个很好的委托方法工具(搜索DBIx::Class
和实例成员声明的Moose delegation
属性),因此用两个或多个ORM对象制作复合业务对象相对容易。如果你愿意,我可以再举一个例子。
HTH
答案 1 :(得分:-6)
我以前在网上的perl项目中工作过。但是在使用像Django之类的东西后,perl的工具如DBI等现在看起来相当简陋和过时。例如,看看django ORM,它优雅且使用效率很高,如果您的查询过于复杂或者ORM妨碍了,您可以绕过它...
这些天我会为这类项目使用python或ruby。 对于一个衬垫,小文本解析或系统管理员的东西,我仍然喜欢使用小的perl片段。但是,如今,我对TMTOWTDI的处理能力超过了几行代码。