【问题标题】:How to get Castle MonoRail's DataBinder/SmartDispatcherController to bind against types containing properties that are interfaces?如何让 Castle MonoRail 的 DataBinder/SmartDispatcherController 绑定到包含接口属性的类型?
【发布时间】:2008-11-20 17:15:39
【问题描述】:

我们在域模型中使用接口来表示实体类。通过使用 LinqToSql,我们有这些的具体实现。我们为每个 LinqToSql 类添加了一个工厂方法,我们的服务层使用它来实例化一个新实体(注意;与控制器的 DataBind 属性相反)。

MonoRail 的默认 DataBinder 实现将忽略定义为接口的属性。

理想情况下,我们不想在 MonoRail 中实例化我们的数据层类 - 接口的全部意义在于分离这些关注点。

此外,我们真的不想创建另一组非 LinqToSql 具体类,其唯一工作是在层之间进行转换。

这里真的漫长的一天结束了;请有人怜悯并指出我们应该用我们自己的实现重载的 IDataBinder 部分,或者暗示我们可能尝试的其他方法? ;-)

【问题讨论】:

    标签: linq-to-sql castle-monorail databinder


    【解决方案1】:

    您应该查看 IParameterBinder。看看a post I've written on the subject

    【讨论】:

      【解决方案2】:

      正如 Ken 指出的那样,您的想法可以使用自定义 IParameterBinder 来实现。

      一个解决方案是使用 IOC:

      • 从其界面解析表单的具体实例
      • 然后使用 IDataBinder 将实例绑定到请求参数

      另一个将使用 IDictionaryAdapter:

      • 为您的界面生成 dto 代理
      • 然后使用 IDataBinder 将 dto 代理实例绑定到请求参数

      注意:如果接口:第二个选项将不起作用:

      • 不公开(哼)
      • 有方法
      • 或事件
      • 或只读属性
      • 或只设置属性

      最后,我不确定在控制器的签名中暴露具体类有什么问题。

      我自己在实现应用层服务中定义的接口的控制器中使用具体的形式,它允许我在两边分离关注点:

      • 控制器端是Http映射和表单/命令的一级数据验证
      • 应用层服务是对表单/命令的业务验证和处理

      【讨论】:

      • 当时,我犯了直接绑定到我的实体类的罪过,恰好是接口。我不再这样做了 ;-)
      猜你喜欢
      • 2012-10-08
      • 2023-03-16
      • 1970-01-01
      • 2020-09-16
      • 1970-01-01
      • 1970-01-01
      • 2018-03-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多