One of the beautiful things about .net core is that it is very modular and configurable.
A key aspect of that flexibility is that it leverages an IoC for registering services, often via interfaces. This in theory allows for replacing a default .net service with a custom implementation of that service with very little effort.
This all sounds awesome in theory. But I have a real work case where I want to replace a default .net core service with my own and I can't figure out how to remove the default service.
More specifically, in the Startup.cs ConfigureServices
method, when services.AddSession()
is called it registers a DistributedSessionStore
vai following code:
services.AddTransient<ISessionStore, DistributedSessionStore>();
as can be seen in the source code: https://github.com/aspnet/Session/blob/rel/1.1.0/src/Microsoft.AspNetCore.Session/SessionServiceCollectionExtensions.cs
I'd like replace that ISessionStore with one of my own creation. So if I have a class RonsSessionStore:ISessionStore
that I want to use to replace the currently registered ISessionStore, how can I do it?
I know I can register my ISessionStore in the Startup.cs ConfigureServices
method via the following:
services.AddTransient<ISessionStore, RonsSessionStore>();
But how can I remove the already registered DistributedSessionStore
?
I tried to accomplish this in the startup.cs ConfigureServices
method via
services.Remove(ServiceDescriptor.Transient<ISessionStore, DistributedSessionStore>());
but it had no effect and the DistributedSessionStore was still in the IoC container. Any ideas?
How does one remove a service from the IoC in the ConfigureServices
method of the startup.cs?
Your code doesn't work because the ServiceDescriptor
class doesn't override Equals
, and ServiceDescriptor.Transient()
returns a new instance, different than the one in the collection.
You would have to find the ServiceDescriptor
in the collection and remove it:
var serviceDescriptor = services.First(s => s.ServiceType == typeof(ISessionStore));
services.Remove(serviceDescriptor);
I'm wondering, why would you still call AddSession()
if you do not want to use the default implementation?
Anyway, you can try and use the Replace
method for this:
services.Replace(ServiceDescriptor.Transient<ISessionStore, RonsSessionStore>());
Quoting the docs:
Removes the first service in
IServiceCollection
with the same service type asdescriptor
and adds to the collection.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With