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