Skip to content

sarul84/DynamicDependencyInject

Repository files navigation

Dynamically inject dependency

Extending the below interface help to resolve configured services as per your own custom logic. Please refer this project for more information.

public interface IServicesProvider<TInterface>
{
        /// <summary>
        /// The method returns corresponding resolved object from service container for the key
        /// </summary>
        /// <param name="key">The key<see cref="string"/></param>
        /// <returns>The implementation of <see cref="TInterface"/></returns>
        TInterface GetInstance(string key);
}

public class ServicesProvider<TInterface> : IServicesProvider<TInterface>
{
        /// <summary>
        /// Defines the httpContextAccessor field
        /// </summary>
        private readonly IHttpContextAccessor httpContextAccessor;

        /// <summary>
        /// Initializes a new instance of the <see cref="ServicesProvider{TInterface}"/> class.
        /// </summary>
        /// <param name="contextAccessor">The contextAccessor<see cref="IHttpContextAccessor"/> object</param>
        public ServicesProvider(IHttpContextAccessor contextAccessor)
        {
            this.httpContextAccessor = contextAccessor;
        }

        /// <summary>
        /// The method returns corresponding resolved object from service container for the key
        /// </summary>
        /// <param name="key">The key<see cref="string"/></param>
        /// <returns>The implementation of <see cref="TInterface"/></returns>
        public TInterface GetInstance(string key)
        {
            var service = this.GetService();
            return service(key);
        }

        /// <summary>
        /// The method returns service container that can be used to resolve and inject object dynamically
        /// </summary>
        /// <returns>The <see cref="Func{string, TInterface}"/></returns>
        private Func<string, TInterface> GetService()
        {
            return (Func<string, TInterface>)this.httpContextAccessor.HttpContext
                .RequestServices.GetService(typeof(Func<string, TInterface>));
        }
}

Register the above interface and implementation class with IoC container

services.AddSingleton(typeof(IServicesProvider<>), typeof(ServicesProvider<>));

Releases

No releases published

Packages

No packages published

Languages