Darshana Bandara
Darshana Bandara

Reputation: 78

StackExchange.Redis.Extensions error after updating nuget

I have updated to the latest StackExchange.Redis.Extensions.Core package and I am getting the following error.

The previous version of StackExchange.Redis.Extensions.Core is - 2.3.0 and the updated new version is - 3.4.0

None of the constructors found with 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' on type 'StackExchange.Redis.Extensions.Core.StackExchangeRedisCacheClient' can be invoked with the available services and parameters:
Cannot resolve parameter 'StackExchange.Redis.Extensions.Core.Configuration.RedisConfiguration configuration' of constructor 'Void .ctor(StackExchange.Redis.Extensions.Core.ISerializer, StackExchange.Redis.Extensions.Core.Configuration.RedisConfiguration)'.
Cannot resolve parameter 'System.String connectionString' of constructor 'Void .ctor(StackExchange.Redis.Extensions.Core.ISerializer, System.String, System.String)'.
Cannot resolve parameter 'System.String connectionString' of constructor 'Void .ctor(StackExchange.Redis.Extensions.Core.ISerializer, System.String, Int32, System.String)'.
Cannot resolve parameter 'StackExchange.Redis.IConnectionMultiplexer connectionMultiplexer' of constructor 'Void .ctor(StackExchange.Redis.IConnectionMultiplexer, StackExchange.Redis.Extensions.Core.ISerializer, System.String)'.
Cannot resolve parameter 'StackExchange.Redis.IConnectionMultiplexer connectionMultiplexer' of constructor 'Void .ctor(StackExchange.Redis.IConnectionMultiplexer, StackExchange.Redis.Extensions.Core.ISerializer, StackExchange.Redis.Extensions.Core.Configuration.ServerEnumerationStrategy, System.String)'.
Cannot resolve parameter 'StackExchange.Redis.IConnectionMultiplexer connectionMultiplexer' of constructor 'Void .ctor(StackExchange.Redis.IConnectionMultiplexer, StackExchange.Redis.Extensions.Core.ISerializer, Int32, System.String)'.
Cannot resolve parameter 'StackExchange.Redis.IConnectionMultiplexer connectionMultiplexer' of constructor 'Void .ctor(StackExchange.Redis.IConnectionMultiplexer, StackExchange.Redis.Extensions.Core.ISerializer, StackExchange.Redis.Extensions.Core.Configuration.ServerEnumerationStrategy, Int32, System.String)'.

I have installed following nuget packages:

Microsoft.Web.RedisSessionStateProvider

StackExchange.Redis
StackExchange.Redis.StrongName

StackExchange.Redis.Extensions.Core
StackExchange.Redis.Extensions.LegacyConfiguration
StackExchange.Redis.Extensions.Newtonsoft

My web.config is as follows:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>   
    <section name="redisCacheClient" type="StackExchange.Redis.Extensions.LegacyConfiguration.RedisCachingSectionHandler, StackExchange.Redis.Extensions.LegacyConfiguration" />
    </configSections>
  <redisCacheClient allowAdmin="true" ssl="True" connectTimeout="3000" database="15" password="IlQZ--------90=">
    <serverEnumerationStrategy mode="Single" targetRole="PreferSlave" unreachableServerAction="IgnoreIfOtherAvailable" />
    <hosts>
      <add host="xxxxxx.redis.cache.windows.net" cachePort="6380" />
    </hosts>
  </redisCacheClient>
  <connectionStrings>
    <add name="RedisConnectionString" connectionString="xxxx.redis.cache.windows.net:6380,password=IlQZ--------90=,ssl=True,synctimeout=15000,abortConnect=False" />
  </connectionStrings>
  <appSettings>

  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.6.1" />
    <httpRuntime targetFramework="4.6.1" />
  </system.web>
  <runtime>
    <assemblyBinding
        xmlns="urn:schemas-microsoft-com:asm.v1">          
      <dependentAssembly>
        <assemblyIdentity name="Autofac" publicKeyToken="17863af14b0044da" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.8.1.0" newVersion="4.8.1.0" />
      </dependentAssembly> 

      <!-- more dependentAssembly -->

      <dependentAssembly>
        <assemblyIdentity name="StackExchange.Redis.Extensions.Core" publicKeyToken="d7d863643bcd13ef" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-3.4.0.0" newVersion="3.4.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

And my OWIN startup class with autofac is as follows :

public void Configuration(IAppBuilder app)
{
    var builder = new ContainerBuilder();
    builder.RegisterControllers(typeof(MvcApplication).Assembly);

    builder.RegisterType<NewtonsoftSerializer>()
        .AsSelf()
        .AsImplementedInterfaces()
        .SingleInstance();

    builder.RegisterType<StackExchangeRedisCacheClient>()
        .AsSelf()
        .AsImplementedInterfaces()
        .SingleInstance();

    var container = builder.Build();
    DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

    app.UseAutofacMiddleware(container);
    app.UseAutofacMvc();
}

What am i doing wrong here?

Upvotes: 1

Views: 3179

Answers (2)

Steve
Steve

Reputation: 50583

The problem is that Autofac does not have the proper information to build the object so I agree with @travis-illig. The way I resolved it was to register the required types first:

builder.RegisterType<JilSerializer>()
       .As<ISerializer>()
       .SingleInstance();

RedisConfiguration redisConfiguration = RedisUtil.GetConfig();
builder.RegisterInstance(redisConfiguration);

builder.RegisterType<StackExchangeRedisCacheClient>()
       .As<ICacheClient>()
       .SingleInstance();

Note I have got a Util class that constructs the Redisconfiguration.

Upvotes: 0

Travis Illig
Travis Illig

Reputation: 23934

Autofac can't resolve anything you don't tell it about. You've told it about:

  • Your controllers.
  • NewtonsoftSerializer
  • StackExchangeRedisClient

But read the exception - there's no parameterless constructor for StackExchangeRedisClient and you didn't tell Autofac about anything else. Autofac doesn't just "read the web.config" or anything. You have to put that together. Read the exception again and register enough stuff that one of the constructors will match.

This is not real code but gives you an idea:

// THIS ISN'T TESTED, FOR IDEA PURPOSES ONLY
builder.Register(c => {
  var config = ConfigurationManager.GetSection("RedisCacheClient");
  var connectionString = config.ConnectionStrings[0];
  return new StackExchangeRedisClient(connectionString);
}).AsSelf()
.AsImplementedInterfaces()
.SingleInstance();

Point being, you have to read the config, or register something in the container that will otherwise satisfy the parameters required to create the Redis client.

Upvotes: 1

Related Questions