I have a generic repository (the generic type parameter being the aggregate 
root type being serialized to the database [mongo]).

The repository takes a parameter which in an IEnumerable of ISync services. 
 Low-level database actions may need to be synchronized to other data, and 
implementors of ISync will do that.

Some psudeocode:

class Repository<T>
{
    public Repository(IEnumerable<ISync<T>> synchronizers)
    {
    ...
    }

    public void Save(T data)
    {
        database.Save(data);
        foreach(synchronizer in _syncrhonizers)
        {
            synchronizer.Sync(data);
        }
    }
}

class SomeRandomSync : ISync<ObjectA>
{
    public void Sync(ObjectAdata)
    {
        //do something with that object perhaps even use another repository
        new Repository<ObjectB>().Save(objectB); //Obviously this is a 
constructor injection, I'm just keeping it simple
    }
}

Most objects don't have an ISync<T> implementation, so the synchronizers do 
nothing.  

However whenever dealing with such low level injected dependencies there 
can easily be a dependency cyle.  What if there is an implementation of 
ISync<ObjectB> that, when syncing ObjectBdecides to Save ObjectA?  Well, an 
infinite loop of saves and re-saves that LUCKILY, Castle Windsor would 
identify ahead of time and tell you "Hey, you've got a dependency cycle and 
you're doing something wrong."

Luckily only 99% of the time, though, because in my case i don't WANT it to 
cause a cyclical dependency, I just want that particular ISync<T> service 
to be ignored.  I want to allow the developers using this code to be able 
to create those dependency cycles (sometimes they are quite necessary 
because SOME implementors of ISync need to be called, and some should just 
be ignored if they can't be - they will surely not cause a cycle in another 
situation.

I tried to do something like this but to no avail (StackOverflowException). 
 Do I have any recourse?

        public Repository(IWindsorContainer windsorContainer)
        {
            var handlers = 
windsorContainer.Kernel.GetHandlers(typeof(ISync<T>));

            var syncers = new List<object>();
            foreach (var handler in handlers)
            {
                try
                {
                    object syncer= 
handler.TryResolve(CreationContext.CreateEmpty());
                    syncers.Add(syncer);
                }
                catch
                {
                }
            }

            _syncers = syncers;
        }

-- 
You received this message because you are subscribed to the Google Groups 
"Castle Project Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/castle-project-users?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to