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 -~----------~----~----~----~------~----~------~--~---
