默认的Rails 4项目生成器现在在控制器和模型下创建目录"Concer".我找到了一些关于如何使用路由问题的解释,但没有关于控制器或模型的解释.
我很确定它与社区当前的"DCI趋势"有关,并且想尝试一下.
问题是,我应该如何使用此功能,是否有关于如何定义命名/类层次结构以使其工作的约定?如何在模型或控制器中包含问题?
我正在与AngularJS合作完成我的最新项目.在文档和教程中,所有模型数据都放入控制器范围.我知道必须存在控制器,因此在相应的视图中.
但是,我不认为该模型应该在那里实施.它可能很复杂并且具有私有属性.此外,人们可能希望在另一个上下文/应用程序中重用它.将所有内容放入控制器完全打破了MVC模式.
对于任何模型的行为都是如此.如果我使用DCI架构并从数据模型中分离行为,我将不得不引入其他对象来保存行为.这可以通过引入角色和上下文来完成.
当然,模型数据和行为可以使用普通的javascript对象或任何"类"模式来实现.但AngularJS的做法是什么呢?使用服务?
所以它归结为这个问题:
在AngularJS最佳实践之后,您如何实现与控制器分离的模型?
我首先通过这篇博文了解了数据,上下文和交互(DCI).着迷于这个概念,我努力将其构建到我的下一个Rails应用程序中.由于DCI与MVC协同工作,我认为同时使API RESTful不会太难.所以我创建了一个RESTful资源,并使用各种上下文扩展它.我在Rails中实现上下文的方法是为扩展控制器操作的模块创建一个目录.所以我看起来像这样:Report/app/contexts/reports_controller.rb
class ReportsController < ApplicationController
before_filter :only => :new do |c|
c.switch_context("submission")
end
# GET /reports
def index
@context.report_list
end
# GET /reports/1
def show
@context.display_report
end
# GET /reports/new
def new
@context.new_report
end
# GET /reports/1/edit
def edit
@context.edit_report
end
# POST /reports
def create
@context.create_report
end
def update
@context.update_report
end
# DELETE /reports/1
def destroy
@context.destroy_report
end
protected
def switch_context(context_name)
session[:context] = context_name
context = session[:context].camelize.constantize
@context ||= self.extend context …Run Code Online (Sandbox Code Playgroud) 我正在关注DCI来构建新Rails应用程序的行为,但我对将验证放在何处有一些疑问.
传统上,如果您要使用ActiveRecord模型管理数据,则在从AR继承的特定类中定义验证,并且它们似乎适合作为数据层的一部分.
但是,在我看来,只有在特定角色下才能进行某些验证是有意义的,并且只应检查对象是否在该上下文中,在所有其他情况下都被忽略.这基本上意味着应该在特定角色定义那些验证,并且当对象在有意义的上下文中使用时,应该使用这些角色模块对对象进行扩展.
您是否认为将这些验证保留在角色中是个好主意?如果是这样,你如何声明它们而不会污染与对象相同类的其他实例?如果我想使用ActiveRecord验证,它们在类级别声明,因此我不能单独将它们附加到对象,强制在角色模块上使用"验证"实例方法的重新声明(附加直接对象的错误数组的错误,或一些类似的技术.
DDD是域驱动设计,它是一种包括无处不在的语言,根实体,价值对象和聚合的方法.
DCI:数据,上下文,交互是Trygve Reenskaug发明的一种编程范式.
如何在新系统中与它们结合?
有没有办法使用Scala的类型系统来简明地指定完整对象图的上下文相关子图?
DCI认为你经常有一个相当复杂的对象图,但在任何一个用例中你通常只想使用一个子图.你有一个Fooa Bar和a Bat,但是当你处于用例1时,你只关心Bar用例2和用户2时的情况Bat.
例如,假设您拥有此结构,Foo->Bar->Baz->Bin并且Role1用例需要和Role2用例需要Foo->Bat->Baz->Buz:
class Foo{
val bar = new Bar() //Only relevant to Role 1
val bat = new Bat() //Only relevant to Role 2
}
class Bar {
val baz = new Baz()
}
class Bat {
val baz = new Baz()
}
//Relevant to both Role 1 and 2 (via Bar or Bat)
class Baz {
val bin = new Bin() //Only relevant to …Run Code Online (Sandbox Code Playgroud) 根据维基百科数据,上下文和交互(DCI)是计算机软件中用于对通信对象系统进行编程的范例。在这里,我不清楚DCI试图解决的问题。能用简单的例子解释一下吗?您的示例中的数据,上下文和交互是什么?
dci ×10
architecture ×2
ruby ×2
abstraction ×1
activerecord ×1
angularjs ×1
javascript ×1
oop ×1
rest ×1
scala ×1
typeclass ×1
validation ×1