我的公司主要的网络应用程序急需一套巧妙的库来使其更易于维护和扩展,我的一个同事建议使用CSLA。于是我买了这本书,但由于:
程序员不再阅读书籍
我想了解SOFlow社区对它的看法。
所以这里有我的问题:
- 有多少人在使用CSLA?
- 有哪些优缺点?
- CSLA是否真的不适用于TDD?
- 其他替代方案是什么?
- 如果您已经停止使用或决定不使用它,原因是什么?
我的公司主要的网络应用程序急需一套巧妙的库来使其更易于维护和扩展,我的一个同事建议使用CSLA。于是我买了这本书,但由于:
程序员不再阅读书籍
我想了解SOFlow社区对它的看法。
所以这里有我的问题:
缺点:
3. 阅读后,CSLA是否真的不适合TDD?
我还没有找到一种有效的方法来使用CSLA进行TDD。尽管如此,我相信有许多比我更聪明的人可能会尝试并取得更大的成功。
4. 我的替代方案是什么?
领域驱动设计目前正在受到大力推广(理所当然 - 对于某些应用程序而言它非常棒)。随着LINQ(以及LINQ to SQL、Entity Framework等)的引入,也出现了许多有趣的模式。Fowler的书PoEAA详细介绍了许多适用于您的应用程序的模式。请注意,有些模式是竞争性的(即Active Record和Repository),因此只适用于特定的情况。虽然CSLA并不完全符合该书中描述的任何模式,但它最接近Active Record(尽管我认为声称这种模式完全匹配是短视的)。
5. 如果您停止使用它或反对它,原因是什么?
由于我认为应用程序的范围太大,超出了CSLA提供的好处,所以我没有完全推荐CSLA用于我的上一个项目。
我不会在Web项目中使用CSLA。我认为有其他更适合在那种环境下构建应用程序的技术。
总之,尽管CSLA绝非万能药,但它适用于某些情况。
希望这可以帮到您!
干杯。
我想再多说几句。
有些人说,与LINQ to SQL等技术相比,CSLA过于冗长。但是这是在比较苹果和橙子。LINQ to SQL是ORM。它提供了一些CSLA没有的功能,而CSLA提供了一些L2S没有的功能,例如集成验证和通过各种远程数据门户的n层持久性。事实上,我认为最后一个n层持久性对我来说最重要。如果我想在网络上使用Entity Framework或LINQ to SQL,我必须在它们之间放置类似WCF的东西,这会使工作量和复杂性大大增加,以至于我认为它比CSLA更冗长。 (现在,我是WCF,REST和SOA的粉丝,但请在真正需要时使用它,例如当您想向第三方公开服务时。对于大多数业务应用程序,它并不是真正需要的,而CSLA是更好的选择。)事实上,对于CSLA的最新版本,Rocky提供了一个WCFDataPortal,我已经使用它。它很棒。
我是SOLID,TDD和其他现代软件开发原则的粉丝,并在任何情况下都尽可能地使用它们。但我认为CSLA的好处超过了这些正统派的一些反对意见,而且无论如何我都成功地(而且容易地)让CSLA与TDD配合得很好,所以这不是问题。
是的,我(嗯,我们)广泛使用它来建模我们的业务流程逻辑,这主要是在Windows窗体应用程序中的数据绑定表单。该应用程序是一个交易系统。CSLA旨在位于UI下面的那一层。
如果您考虑您的标准复杂的企业应用程序,您可能会有一个具有许多字段的表单,这些字段有许多规则(包括跨字段验证规则),您可能会调用模态对话框来编辑某个子对象,您可能希望能够取消这些对话框并恢复到先前的状态。CSLA支持此功能。
它的缺点是它有一定的学习曲线。
关键是要记住使用CSLA来建模用户与某个应用程序上的表单的交互方式。对我来说最有效的方法是设计UI并了解其流程、行为和验证规则,然后再构建CSLA对象。不要让您的CSLA对象驱动UI设计。
我们还发现,能够使用CSLA业务对象在服务器端验证从客户端发送的对象非常有用。
我们还内置了机制,以异步方式执行针对Web服务的验证(即检查柜台方的信用限额范围是否符合主控方的要求)。
CSLA 在 UI、业务逻辑和持久化之间实行了强分离,并针对它们编写了大量单元测试。尽管您是从 UI 设计中进行驱动,这可能并不严格符合 TDD,但这并不意味着它无法进行测试。
唯一真正的替代方案是创建自己的模型\业务对象,但很快您就会发现自己需要实现 CSLA 已经提供的功能(INotifyPropertyChanged、IDataErrorInfo、PushState、PopState 等)。
我曾经在一个项目中使用过CSLA,它非常出色,让事情变得更加简单和整洁。
我们不再需要让团队按照各自的风格编写业务对象,现在有一个共同的标准来进行工作。
//andy
我几年前曾经接触过它。它是一个非常出色的架构,但同时也非常复杂,很难理解或修改,并且它解决的问题大多数开发基于Web的应用程序并没有必要解决。它更多是为Windows应用程序和处理多级撤销而开发的,强调事务逻辑。你可能会听到人们说,因为Web应用程序是请求-响应方式,所以使用这个架构不太合适,但对于使用AJAX风格的Web应用程序,这个论点可能就不成立了。
它有一个非常深入的对象模型,需要一段时间才能真正理解。当然,几年的时间内很多东西都可能发生变化。我很想听听其他最近的意见。
综合考虑,它不是我首选的架构。
虽然我同意许多评论,尤其是单元测试方面的评论,但我要为CSLA辩护...
我的公司广泛使用它来创建Windows Forms数据输入应用程序,并获得了很高的成功度。
总的来说,我认为它可能引起的任何问题都被其带来的好处所超越。
更新:除此之外,我们仍在为我们的Windows Forms应用程序使用它,但试验表明,如果您不需要太多它的功能,当您创建Web站点等其他应用程序时,它可能过于繁琐,因此我们现在正在研究更轻量级的选择。
我加入了一个团队,他们强制使用CSLA。我们不使用远程数据门户,这也是我能接受使用该框架的唯一原因。我从未认同CSLA的理念,也许这就是为什么我对它没有好感的原因,抱歉。
以下是其中的一些问题:
我不需要在我的代码和.NET框架之间设置路障,这就是我对该框架的感觉。我只有有限的列表对象选项,而我只需忽略.NET框架中的丰富列表对象。
我们有这些只读列表和非只读列表,这完全荒谬。如果我必须向列表添加项目,则必须重新创建整个列表……你是认真的吗?
然后csla想要管理我的对象状态,这很好,但实际上没有什么东西被暴露出来。有时我想手动更改对象状态,而不是再次获取它,这似乎是csla希望我做的事情。我最终会创建许多属性来公开csla认为我不应直接访问的选项。
为什么我不能只实例化一个对象?我们最终创建静态方法来实例化一个对象并将其传回……你在开玩笑吗?
检查框架源代码,我认为其中的反射代码太重了。
使用csla的原因:
我们开始使用CSLA是因为我们认为它可以帮助我们的模型层。但事实上,它有点过头了,现在我们主要只使用SmartDate类,因为我们已经链接到了这个库。
我们认为验证接口会真正帮助我们执行业务规则,但它与WCF和序列化不兼容(我们仍然停留在2.0.3.0版本,所以可能已经有所改变)。