代码之家  ›  专栏  ›  技术社区  ›  Peter Mounce

如何让Castle MonoRail的DataBinder/SmartDispatcherController绑定到包含接口属性的类型?

  •  1
  • Peter Mounce  · 技术社区  · 17 年前

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

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

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

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

    这是一个结束 真正地 这里漫长的一天;请有人发发慈悲,指出我们应该用自己的实现重载的ViewModel Binder部分,或者暗示我们可能尝试的其他方法? ;-)

    2 回复  |  直到 17 年前
        1
  •  3
  •   Ken Egozi    17 年前

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

        2
  •  0
  •   smoothdeveloper    16 年前

    正如Ken所指出的,你的想法可以用一个自定义的IParameterBinder来实现。

    一个解决方案是使用IOC:

    • 从表单的接口解析表单的具体实例
    • 然后使用ViewModel Binder将实例绑定到请求参数

    另一种方法是使用IDictionaryAdapter:

    • 为您的接口生成一个dto代理
    • 然后使用ViewModel Binder将dto代理实例绑定到请求参数

    注意:如果接口:

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

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

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

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