如何让 Castle MonoRail 的 DataBinder/SmartDispatcherController 绑定到包含接口属性的类型?
-
08-07-2019 - |
题
我们使用接口来表示领域模型中的实体类。我们通过使用 LinqToSql 来具体实现这些。我们向每个 LinqToSql 类添加了一个工厂方法,我们的服务层使用该方法来实例化新实体(注意;而不是控制器的 DataBind 属性执行此操作)。
MonoRail 的默认 DataBinder 实现将忽略定义为接口的属性。
理想情况下,我们不想在 MonoRail 中实例化数据层类 - 接口的全部目的是分离这些问题。
另外,我们并不真的想创建另一组非 LinqToSql 具体类,其唯一的工作是在层之间进行转换。
这是一个的结束 真的 这里漫长的一天;请有人怜悯并指出 IDataBinder 中我们应该用自己的实现重载的部分,或者暗示我们可能尝试的其他方法?;-)
解决方案
你应该看看IParameterBinder。看看我写过一篇关于这个主题的文章
其他提示
正如 Ken 指出的,您的想法可以通过自定义 IParameterBinder 来实现。
解决方案是使用 IOC:
- 从其界面解析表单的具体实例
- 然后使用 IDataBinder 将实例绑定到请求参数
另一种方法是使用 IDictionaryAdapter:
- 为您的接口生成 dto 代理
- 然后使用 IDataBinder 将 dto 代理实例绑定到请求参数
注意:如果界面如下,第二个选项将不起作用:
- 不公开(哼)
- 有方法
- 或事件
- 或只读属性
- 或仅设置属性
最后,我不确定在控制器签名中暴露具体类的问题是什么。
我自己在控制器中使用具体形式来实现应用程序层服务中定义的接口,它允许我将两侧的关注点分开:
- 控制器端是Http映射和表单/命令的第一级数据验证
- 应用层服务是表单/命令的业务验证和处理
不隶属于 StackOverflow