That is actually my fault :-)

This is the problem:

protected object ResolveComponent(IHandler handler, Type service,
IDictionary additionalArguments)
        {
            bool createdContext = currentCreationContext == null;
            CreationContext context = currentCreationContext ??
                                      CreateCreationContext(handler,
service, additionalArguments);
            currentCreationContext = context;
            try
            {
                object instance = handler.Resolve(context);

                // ReleasePolicy.Track(instance, handler);

                return instance;
            }
            finally
            {
                if(createdContext)
                    currentCreationContext = null;
            }
        }

I added this to ensure that recursively calling the container during resolve
will not get a stack overflow, but it breaks this scenario, because you are
building a non generic type, and then a generic type, but the context is not
recreated.



On Thu, Nov 6, 2008 at 6:35 PM, Jason Meckley <[EMAIL PROTECTED]>wrote:

>
> I've found a bug in the entity injection and for the life of me I
> can't fix it.
>
> here's the scenario.
> i want to resolve the repository and then invoke either findone or get
> depending on certain criteria
> so I created a test to make sure I can resolve the repository
> correctly
>
> Type type = typeof(IRepository<>).MakeGenericType(typeof(AnEntity));
> object repository = IoC.Resolve(type);
> object entity = type.GetMethod("Get").Invoke(repository, new object[]
> {id});
>
> and this works.
>
> So now I implement this in RhinoIglooFacility.InjectEntities
>
>    Type repositoryType =
> typeof(IRepository<>).MakeGenericType(property.PropertyType);
>    object repository = kernel.Resolve(repositoryType);
>    entity = repositoryType
>        .GetMethod("Get")
>        .Invoke(repository, new object[] { id });
>
> but this throws an ArgumentException "type has 1 generic parameter,
> but 0 where supplied" at kernel.Resolve
> the problem starts here:
> Castle.MicroKernel.Handlers.DefaultGenericHandler.Resolve(CreationContext)
>
> this doesn't make sense to me. Why would the original test pass, but
> code within the facility fail?
>
> however if I use this code in RhinoIglooFacility, it works.
>
> object entity =
>
> UnitOfWork.GetCurrentSessionFor(property.PropertyType).Get(property.PropertyType,
> id);
> however don't want to pull straight from session and the repositories
> could be decorated and that functionality is required.
>
> my final goal is to create 3 strategies for entity retrieval.
> 1. Repository.Get (originally used AR moderator.Get)
> 2. Repository.FindOne with IFetchingStrategy<>
> 3. Repository.FindOne with EagerLoad (original functionality)
>
> any ideas where to go from here?
> >
>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Rhino Tools Dev" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/rhino-tools-dev?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to