2

I am working on an web application (.net core 2.2) and trying to replace existing dependency over an querystring parameter in controller. I know, it is possible to replace dependency inside Startup.cs (ConfigureServices(IServiceCollection services) method). But problem is I cant access "IServiceCollection " in controller. Do you guys have an idea how to achive it?

This is the way to replace dependency in Startup. "ServiceCollectionDescriptorExtensions" has "Replace" method.

services.Replace(ServiceDescriptor.Scoped<IFooService,AnotherVersionOfFooService>());

https://learn.microsoft.com/en-us/dotnet/api/microsoft.extensions.dependencyinjection.extensions.servicecollectiondescriptorextensions?view=dotnet-plat-ext-3.1#Microsoft_Extensions_DependencyInjection_Extensions_ServiceCollectionDescriptorExtensions

Thanks

1 Answers1

0

Something like this ...

public class ServicesCollections {

    public IConfiguration Configuration { get; }
    public IServiceCollection Services { get; }
    public ServicesCollections()
    {
    }
    public ServicesCollections(IConfiguration configuration, IServiceCollection services)
    {
        Configuration = configuration;
        Services = services;
    }


}


/// <summary> Generic singleton with double check pattern and with instance parameter </summary>
/// <typeparam name="T"></typeparam>
public class SingleObject<T> where T : class, new()
{
    /// <summary> Lock object </summary>
    private static readonly object _lockingObject = new object();

    /// <summary> Instance </summary>
    private static T _singleObject;

    /// <summary> ctor </summary>
    public SingleObject()
    {
    }

    /// <summary> Instance with parameter </summary>
    /// <param name="param">Parameters</param>
    /// <returns>Instance</returns>
    public static T Instance(params dynamic[] param)
    {
        if (_singleObject == null)
        {
            lock (_lockingObject)
            {
                if (_singleObject == null)
                {
                    _singleObject = (T)Activator.CreateInstance(typeof(T), param);
                }
            }
        }
        return _singleObject;
    }
}

In your start up ---

public void ConfigureServices(IServiceCollection services) { services.AddControllersWithViews();

        services.Configure<CookiePolicyOptions>(options =>
        {
            //This lambda determines whether user consent for non-essential cookies is needed for a given request.
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = Microsoft.AspNetCore.Http.SameSiteMode.None;
        }
       );

        services.AddMvc().SetCompatibilityVersion(Microsoft.AspNetCore.Mvc.CompatibilityVersion.Latest);

        services.AddMvc()
            .AddControllersAsServices();

        JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
        services.AddRazorPages();


       var configs = Interfaces.SingleObject<Interfaces.ServicesCollections>.Instance(Configuration, services);
        services.AddScoped<ServicesCollections>();
        services.AddTransient(ctx => new SSO.Gateway.Web.Controllers.LoginController(configs));

ConfigureIdentityServer(services);

    }

In your controller --

public class YourController : Controller
{
    public YourController (ServicesCollections obj)
    {
        Configuration = obj.Configuration;
        Services = obj.Services;
        ConfigureServices();
    }

    public IConfiguration Configuration { get; }

    public IServiceCollection Services { get; }

    public void ConfigureServices()
    { 

    }
Silas
  • 11
  • 2