views:

862

answers:

1

I am trying to implement a decorator chain for my data-access based on IRepository. I have a Repository that does the data- access (at the moment just in-memory list) {1}, and I have one that does validation {2}. On top of that, I have a specialisation of my Repository, IUsersRepository {3}, which defines another method on the base interface. I am running on the latest trunk revision 5376.

I would like to be able to register my components using the fluent interface - is it possible to specify, as it is via XML, the key of the service to use as the innerRepo? If so, how? (See Bitter Coder Decorator tutorial for an XML-config example). I would prefer to not need to rely on the order of registrations, apart from anything else.

I am following this blog post.

I have been able to get the decorator chain working if I ask the container for IRepository {4}; I see my ValidatingRepository methods get called before my data-access. But I have not been able to get it working if I ask the container for IUserRepository (I get an InvalidCastException - I guess this is expected, but is it work-aroundable?).

I would like to avoid needing to use one decorated-repo and one specialised-methods repository in my services; this strikes me as error-prone. At the moment, my specialised methods are all to do with fetching entities by different criteria - I suppose I could make my Get method take a detached-criteria - that would allow me to only have one on my interface, and eliminate the need for the specialised interfaces. Except that I'm not allowed to because we haven't decided to definitely use NHibernate. Perhaps if I made IRepo.Get take a delegate or an IQueryable? Any ideas? I've been banging my head against this all morning and wouldn't be surprised if I have tunnel vision, and there's a different, better, approach; any suggestions are welcomed!

{1} - {4} can be seen at utilitybase's copy/paste facility.

+2  A: 

Cross-posted here (with solution).

Mauricio Scheffer