Reputation: 78
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
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
Reputation: 23934
Autofac can't resolve anything you don't tell it about. You've told it about:
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