Как заставить DataBinder/SmartDispatcherController Castle MonoRail привязываться к типам, содержащим свойства, которые являются интерфейсами?
-
08-07-2019 - |
Вопрос
Мы используем интерфейсы для представления классов сущностей в нашей модели предметной области.У нас есть конкретные реализации этих возможностей благодаря использованию LinqToSql.Мы добавили фабричный метод в каждый класс LinqToSql, который наш сервисный уровень использует для создания экземпляра нового объекта (примечание:в отличие от атрибута DataBind контроллера, который делает это).
Реализация DataBinder по умолчанию в MonoRail будет игнорировать свойства, определенные как интерфейсы.
В идеале мы не хотим создавать экземпляры наших классов уровня данных в MonoRail — вся суть интерфейсов в том, чтобы разделить эти задачи.
Кроме того, мы на самом деле не хотим создавать еще один набор конкретных классов, отличных от LinqToSql, единственная задача которых — перевод между уровнями.
Это конец Действительно долгий день здесь;пожалуйста, может ли кто-нибудь проявить милосердие и указать нам на части IDataBinder, которые нам следует перегрузить нашими собственными реализациями, или намекнуть на другие подходы, которые мы могли бы попробовать?;-)
Решение
Вы должны смотреть на IParameterBinder. взгляните на пост, который я написал на эту тему
Другие советы
Как отметил Кен, вашу идею можно реализовать с помощью специального IParameterBinder.
Решением было бы использовать IOC:
- разрешить конкретный экземпляр формы из ее интерфейса
- затем используйте IDataBinder для привязки экземпляра к параметрам запроса
Другой вариант будет использовать IDictionaryAdapter:
- создать прокси-сервер dto для вашего интерфейса
- затем используйте IDataBinder для привязки экземпляра прокси-сервера dto к параметрам запроса.
Примечание:второй вариант не будет работать, если интерфейс:
- не публично (хм)
- имеет методы
- или события
- или свойства только для чтения
- или установить только свойства
Наконец, я не уверен, в чем проблема с раскрытием конкретного класса в сигнатуре контроллера.
Я сам использую конкретную форму в контроллерах, реализующих интерфейс, определенный в службах прикладного уровня, это позволяет мне разделить проблемы с обеих сторон:
- сторона контроллера — это HTTP-сопоставление и проверка данных первого уровня формы/команды.
- услуги прикладного уровня — это бизнес-проверка и обработка формы/команды.