K...i uploaded a patch
http://support.castleproject.org/projects/IOC/issues/view/IOC-ISSUE-140

This applies the fix for all services, not just those using the
FirstInterface registration call.

I also included a test for the behaviour.
mike

On Dec 23, 5:32 pm, "Craig Neuwirt" <[email protected]> wrote:
> Good ? Hammett,
>
>   I am not exactly sure.   If anyone knows, speak up or we should report it
>
> On Tue, Dec 23, 2008 at 6:28 PM, hammett <[email protected]> wrote:
>
> > Is the bug reported?
>
> > On Tue, Dec 23, 2008 at 4:16 PM, Craig Neuwirt <[email protected]> wrote:
>
> > > On Tue, Dec 23, 2008 at 6:11 PM, Mike Nichols <[email protected]>
> > > wrote:
>
> > >> Hi Craig
> > >> It turns out I was dealing with two different problems, my
> > >> misunderstanding of .WithService and most importantly a bug in the CLR
> > >> I saw Bill Pierce posted a patch for a bit ago. The SelectDescriptor
> > >> only sanitizes the interface when using .FirstInterface(), so when I
> > >> was calling .GetInterfaces() from a .Select() call the interface
> > >> definition wasn;t getting handled correctly.
>
> > > Yup, very annoying bug
>
> > >> It seems like all registrations of services should get passed through
> > >> this CLR workaround, yes? If so I can submit a patch that would do
> > >> this.
>
> > >  Sure
>
> > >> When I change my test to the following I am getting the generic
> > >> service registered...removing the workaround call makes the test fail:
> > >> [TestFixture]
> > >>        public class RegistrationTest2
> > >>        {
> > >>                [Test]
> > >>                public void ShouldGetAllLocalTasks()
> > >>                {
> > >>                        var kernel = new DefaultKernel();
>
> > >>  kernel.Register(AllTypes.Of<ILocalTask>().FromAssembly
> > >> (Assembly.GetExecutingAssembly())
> > >>                                                .WithService.Select((t,
> > b)
> > >> =>
> > >>                                                                    from
> > >> type in t.GetInterfaces()
> > >>                                                                    where
> > >> !type.Equals(typeof
> > >> (ILocalTask))
>
> >  select
> > >> GetSelectable(type)));
>
> > >>  Assert.IsNotNull(kernel.Resolve<ILocalGenericTask<object>>());
> > >>                }
> > >>                public Type GetSelectable(Type check)
> > >>                {
> > >>                        // This is a workaround for a CLR bug in
> > >>                        // which GetInterfaces() returns interfaces
> > >>                        // with no implementations.
> > >>                        if (check.IsGenericType && check.ReflectedType ==
> > >> null)
> > >>                        {
> > >>                                bool shouldUseGenericTypeDefinition =
> > >> false;
> > >>                                foreach (Type argument in
> > >> check.GetGenericArguments())
> > >>                                {
> > >>                                        shouldUseGenericTypeDefinition |=
> > >> argument.IsGenericParameter;
> > >>                                }
> > >>                                if (shouldUseGenericTypeDefinition)
> > >>                                        return
> > >> check.GetGenericTypeDefinition();
> > >>                        }
> > >>                        return check;
>
> > >>                }
>
> > >>        }
> > >>        public interface ILocalTask { }
> > >>        public interface ILocalGenericTask<T1>:ILocalTask{}
> > >>        public class Task2<T1> : ILocalGenericTask<T1>{ }
>
> > >> On Dec 23, 4:24 pm, "Craig Neuwirt" <[email protected]> wrote:
> > >> > I think you want WithService.Base().  What you had orignally would
> > >> > register
> > >> > the type with the implementation type.
>
> > >> > On Tue, Dec 23, 2008 at 4:21 PM, Mike Nichols
> > >> > <[email protected]>wrote:
>
> > >> > > OK I got the failing test above working but it seems odd. You have
> > to
> > >> > > specify '.FromInterface' explicilty but that seems redundant since
> > you
> > >> > > just specified '.BasedOn':
> > >> > > [Test]
> > >> > >                public void ShouldGetAllLocalTasks()
> > >> > >                {
> > >> > >                        var kernel = new DefaultKernel();
> > >> > >                        kernel.Register(AllTypes.FromAssembly(typeof
> > >> > > (RegistrationTest2).Assembly)
> > >> > >                                .BasedOn<ILocalTask>()
> > >> > >                                .WithService
> > >> > >                                .FromInterface(typeof(ILocalTask)));
> > >> > >                        Assert.AreNotEqual<int>(0,
> > >> > > kernel.GetHandlers(typeof
> > >> > > (ILocalTask)).Length);//pass
> > >> > >                 }
>
> > >> > > On Dec 23, 11:45 am, Mike Nichols <[email protected]> wrote:
> > >> > > > I updated my trunk just a few days old and all my AllTypes
> > >> > > > registrations are broken. The first test below fails.
> > >> > > > I have tried BasedOn and it is failing too.
> > >> > > > I did update .net 2,3,3.5 with the most recent service packs, so
> > >> > > > wonder if that might have something to do with it?
> > >> > > > Any ideas?
>
> > >> > > >                 [Test]
> > >> > > >                 public void ShouldGetAllLocalTasks()
> > >> > > >                 {
> > >> > > >                         kernel = new DefaultKernel();
>
> > >> > > kernel.Register(AllTypes.Of<ILocalTask>().FromAssembly
> > >> > > > (Assembly.GetExecutingAssembly()));
> > >> > > >                         IHandler[] handlers =
> > >> > > kernel.GetHandlers(typeof(ILocalTask));
> > >> > > >                         Assert.AreNotEqual(0,
> > >> > > > handlers.Length);//fails
> > >> > > >                 }
> > >> > > >                 [Test]
> > >> > > >                 public void ShouldRegisterTask()
> > >> > > >                 {
> > >> > > >                         kernel = new DefaultKernel();
>
> > >> > > kernel.Register(Component.For<ILocalTask>().ImplementedBy<Task1>
> > >> > > > ());
> > >> > > >                         IHandler[] handlers =
> > >> > > kernel.GetHandlers(typeof(ILocalTask));
> > >> > > >                         Assert.AreNotEqual(0,
> > >> > > > handlers.Length);//passes
> > >> > > >                 }
> > >> > > >                 public interface ILocalTask { }
> > >> > > >                 public class Task1 : ILocalTask { }
>
> > --
> > Cheers,
> > hammett
> >http://hammett.castleproject.org/
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Castle Project Users" 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/castle-project-users?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to