Search code examples
c#dependency-injectionasp.net-web-api2simple-injector

The service type IAssembliesResolver is not supported. Parameter name: serviceType


I'm having some issues trying to wire Simple Injector and web api

the error I'm getting is:

The service type IAssembliesResolver is not supported. Parameter name: serviceType

and it throws the exception by the time I'm trying to register the controllers with the extension method that comes with the integration library for simpleinjector and web api (nuget)

simple injector webapi integraton package

container.RegisterWebApiControllers(GlobalConfiguration.Configuration);

I just modified the code to override the IAssemblyResolver but it doesn't work

public static void Initialize()
    {
        GlobalConfiguration.Configuration.Services
        .Replace(typeof(IAssembliesResolver),
            new CustomAssembliesResolver());

        var container = new Container();

        InitializeContainer(container);

        container.RegisterWebApiControllers(GlobalConfiguration.Configuration);

        container.Verify();

        GlobalConfiguration.Configuration.DependencyResolver =
            new SimpleInjectorWebApiDependencyResolver(container);
    }

I took the custom assembly resolver from this question and I just pointed it to the bin folder

public class CustomAssembliesResolver:DefaultAssembliesResolver
    {
        public override ICollection<Assembly> GetAssemblies()
        {
            var appPath = AppDomain.CurrentDomain.BaseDirectory;

            var  plugins = (
             from file in Directory.GetFiles(
                 appPath + "\\bin", "*.dll",
                 SearchOption.AllDirectories)
             let assembly = Assembly.LoadFile(file)
             select assembly)
             .ToArray();    

            return base.GetAssemblies()
                .Union(plugins).ToArray();
        }
    }

Any Ideas?

UPDATE:

this is the stack:

[ArgumentException: The service type IAssembliesResolver is not supported.
Parameter name: serviceType]
   System.Web.Http.Services.DefaultServices.GetService(Type serviceType) +529
   System.Web.Http.ServicesExtensions.GetService(ServicesContainer services) +62
   System.Web.Http.ServicesExtensions.GetServiceOrThrow(ServicesContainer services) +60
   SimpleInjector.SimpleInjectorWebApiExtensions.RegisterWebApiControllers(Container container, HttpConfiguration configuration) +107
   ProjectName.Api.App_Start.SimpleInjectorWebApiInitializer.Initialize() in c:\Users\User\Documents\Visual Studio 2013\Projects\ProjectName.Api\Project.Api\App_Start\SimpleInjectorWebApiInitializer.cs:25

[TargetInvocationException: Exception has been thrown by the target of an invocation.]
   System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor) +0
   System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments) +229
   System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) +211
   System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters) +35
   WebActivator.BaseActivationMethodAttribute.InvokeMethod() +341
   WebActivator.ActivationManager.RunActivationMethods() +534
   WebActivator.ActivationManager.RunPostStartMethods() +38
   WebActivator.StartMethodCallingModule.Init(HttpApplication context) +159
   System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext, HttpContext context, MethodInfo[] handlers) +530
   System.Web.HttpApplication.InitSpecial(HttpApplicationState state, MethodInfo[] handlers, IntPtr appContext, HttpContext context) +304
   System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext, HttpContext context) +404
   System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext) +475

[HttpException (0x80004005): Exception has been thrown by the target of an invocation.]
   System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +12617364
   System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +159
   System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +12456981

Solution

  • After struggling for some hours I got to the point to get this exception:

    Entry point was not found

    it turned out that this the binding redirect was missing

    <assemblyIdentity name="System.Web.Http" publicKeyToken="31bf3856ad364e35" culture="neutral" />
      <bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="5.0.0.0" />
      </dependentAssembly>
    

    thanks to @steven to help me pointing out the direction to solve this issue

    I removed the CustomAssembliesResolver and everything works fine now!