Using fluent interface to register components in a decorator chain, when there are also specialised service-types?

167 views
Skip to first unread message

petemounce

unread,
Oct 13, 2008, 7:06:04 AM10/13/08
to Castle Project Users
Hi all

I am trying to implement a decorator chain for my data-access based on
IRepository<TEntity, TKey>. 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
http://blog.bittercoder.com/PermaLink,guid,4863e460-2985-475c-9266-80b4895e80de.aspx
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 (http://blog.bittercoder.com/
PermaLink,guid,63653be2-d0d4-4a0b-b3e5-a1572aad5c8b.aspx ).

I have been able to get the decorator chain working if I ask the
container for IRepository<User, int> [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!

What does "ForwardedTypes" mean, by the way?

Thanks in advance!
Pete

[1] - [4] can be seen at http://utilitybase.com/paste/9003

Victor Kornov

unread,
Oct 13, 2008, 11:23:31 AM10/13/08
to castle-pro...@googlegroups.com
You need to use ServiceOverrides "to specify the key of the service to use as the innerRepo"

"ForwardedTypes" means you'' get the same component instance whe resolving all forwarded to types.

petemounce

unread,
Nov 24, 2008, 5:01:13 AM11/24/08
to Castle Project Users
Thanks! Apologies for not replying earlier.

Pete
Reply all
Reply to author
Forward
0 new messages