volosoft / castle-windsor-ms-adapter

Castle Windsor ASP.NET Core / Microsoft.Extensions.DependencyInjection Adapter
https://www.nuget.org/packages/Castle.Windsor.MsDependencyInjection
MIT License
85 stars 29 forks source link

ArgumentNullException when using ServiceOverride for named parameter #23

Closed mbp closed 6 years ago

mbp commented 6 years ago

Consider the following code:

public class Program
{
    static void Main(string[] args)
    {
        var services = new ServiceCollection();

        var container = new WindsorContainer();
        SetupServiceProvider(container, services);
        container.Install(new CustomInstaller());

        var myService = container.Resolve<IMyService>();
    }

    private static void SetupServiceProvider(IWindsorContainer container, IServiceCollection services)
    {
        WindsorRegistrationHelper.CreateServiceProvider(container, services);
    }
}

public class AnyClass { }

public class CustomInstaller : IWindsorInstaller
{
    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        container.Register(
            Component.For<AnyClass>()
                .UsingFactoryMethod(k => new AnyClass())
                .Named("CustomAnyClass"),
            Component.For<IMyService>()
                .ImplementedBy<MyService>()
                .DependsOn(ServiceOverride.ForKey("anyClass").Eq("CustomAnyClass")));
    }
}

public interface IMyService { }

public class MyService : IMyService
{
    public MyService(AnyClass anyClass)
    {
    }
}

This throws the below exception. However when I uncomment SetupServiceProvider(container, services) line (e.g. disabling use of this library), it works. The type is resolved correctly.

ArgumentNullException
Value cannot be null.
Parameter name: type
at System.Reflection.IntrospectionExtensions.GetTypeInfo(Type type)
at Castle.Windsor.MsDependencyInjection.MsOptionsSubResolver.CanResolve(CreationContext context, ISubDependencyResolver contextHandlerResolver, ComponentModel model, DependencyModel dependency)
at Castle.MicroKernel.Resolvers.DefaultDependencyResolver.<>c__DisplayClass15_0.<CanResolveFromSubResolvers>b__0(ISubDependencyResolver s)
at System.Linq.Enumerable.Any[TSource](IEnumerable`1 source, Func`2 predicate)
at Castle.MicroKernel.Resolvers.DefaultDependencyResolver.CanResolve(CreationContext context, ISubDependencyResolver contextHandlerResolver, ComponentModel model, DependencyModel dependency)
at Castle.MicroKernel.Handlers.AbstractHandler.HasValidComponentFromResolver(DependencyModel dependency)
at Castle.MicroKernel.Handlers.AbstractHandler.AddResolvableDependency(DependencyModel dependency)
at Castle.MicroKernel.Handlers.AbstractHandler.AddDependency(DependencyModel dependency)
at Castle.MicroKernel.Handlers.AbstractHandler.InitDependencies()
at Castle.MicroKernel.Handlers.AbstractHandler.Init(IKernelInternal kernel)
at Castle.MicroKernel.Handlers.DefaultHandlerFactory.Create(ComponentModel model)
at Castle.MicroKernel.DefaultKernel.AddCustomComponent(ComponentModel model)
at Castle.MicroKernel.DefaultKernel.Register(IRegistration[] registrations)
at Castle.Windsor.WindsorContainer.Register(IRegistration[] registrations)
at ConsoleApp38.CustomInstaller.Install(IWindsorContainer container, IConfigurationStore store) in C:\ConsoleApp38\ConsoleApp38\Program.cs:line 51
at Castle.Windsor.WindsorContainer.Install(IWindsorInstaller[] installers, DefaultComponentInstaller scope)
at Castle.Windsor.WindsorContainer.Install(IWindsorInstaller[] installers)
at ConsoleApp38.Program.Main(String[] args) in C:\ConsoleApp38\ConsoleApp38\Program.cs:line 19
hikalkan commented 6 years ago

Can you add a unit test (and send PR) for this case? If you don't have time, I can do it.

mbp commented 6 years ago

See PR #24

hikalkan commented 6 years ago

Thanks a lot. Will work on that.

hikalkan commented 6 years ago

I suppose it's solved by https://github.com/volosoft/castle-windsor-ms-adapter/pull/29