How to get Castle MonoRail's DataBinder/SmartDispatcherController to bind against types containing properties that are interfaces?

StackOverflow https://stackoverflow.com/questions/306103

Question

We're using interfaces to represent entity classes in our domain model. We have concrete implementations of these by virtue of using LinqToSql. We have added a factory method to each LinqToSql class which our service layer uses to instantiate a new entity (note; as opposed to the controller's DataBind attribute doing it).

MonoRail's default DataBinder implementation will ignore properties that are defined as interfaces.

Ideally, we don't want to instantiate our data-layer classes in MonoRail - the whole point of the interfaces is to separate these concerns.

Also, we don't really want to create another set of non-LinqToSql concrete classes whose only job is to translate between layers.

It's the end of a really long day over here; please can someone have mercy and point us at the parts of IDataBinder that we should overload with our own implementations, or hint at other approaches we might attempt? ;-)

Was it helpful?

Solution

You should be looking at IParameterBinder. take a look at a post I've written on the subject

OTHER TIPS

As Ken pointed, your idea could be implemented with a custom IParameterBinder.

A solution would be to use IOC:

  • resolve concrete instance of the form from it's interface
  • then use IDataBinder to bind the instance to the request params

Another one would be using IDictionaryAdapter:

  • generate a dto proxy for your interface
  • then use IDataBinder to bind the dto proxy instance to the request params

NB: second option won't work if interface:

  • is not public (hum)
  • has methods
  • or events
  • or readonly properties
  • or setonly properties

Last, I'm unsure of what is the problem exposing concrete class in controller's signature.

I myself use concrete form in controllers implementing interface defined in application layer services, it allows me to have concerns separated on both side:

  • controller side is Http mapping and first level data validation of the form/command
  • application layer services is business validation and processing of the form/command
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top