• Asp.Net Core中注入泛型接口的依赖项


    1、扩展批量注入类

    public static class ServicesExtersion
        {
            public static void AddClassesAsImplementedInterface(
                this IServiceCollection services
                , Assembly assembly
                , Type compareType
                , ServiceLifetime lifetime = ServiceLifetime.Scoped)
            {
                assembly.GetTypesAssignableTo(compareType).ForEach((type) =>
                {
                    foreach (var implementedInterface in type.ImplementedInterfaces)
                    {
                        switch (lifetime)
                        {
                            case ServiceLifetime.Scoped:
                                services.AddScoped(implementedInterface, type);
                                break;
                            case ServiceLifetime.Singleton:
                                services.AddSingleton(implementedInterface, type);
                                break;
                            case ServiceLifetime.Transient:
                                services.AddTransient(implementedInterface, type);
                                break;
                        }
                    }
                });
            }
    
            public static List<TypeInfo> GetTypesAssignableTo(this Assembly assembly, Type compareType)
            {
    
                var typeInfoList = assembly.DefinedTypes.Where(x => x.IsClass
                                    && !x.IsAbstract
                                    && x != compareType
                                    && x.GetInterfaces().Any(i => i.IsGenericType
                                    && i.GetGenericTypeDefinition() == compareType))?.ToList();
    
                return typeInfoList;
            }
        }

    2、Startup注入

    // 注入泛型依赖项
                services.AddClassesAsImplementedInterface(Assembly.Load("WebApplication2"), typeof(IServices<>));

    3、接口实现类

    public class User
        {
        }
    
    public class Role
        {
        }
    
    public class UserServices: IServices<User>
        {
            public async Task<string> GetData()
            {
                return await Task.FromResult("User服务实现类");
            }
    
            public async Task<User> GetObj()
            {
                return await Task.FromResult(new User());
            }
        }
    
    public class RoleServices:IServices<Role>
        {
            public async Task<string> GetData()
            {
                return await Task.FromResult("Role服务实现类");
            }
    
            public async Task<Role> GetObj()
            {
                return await Task.FromResult(new Role());
            }
        }
    
     public interface IServices<T>
        {
            Task<string> GetData();
    
            Task<T> GetObj();
        }

    4、controll控制器实现

    public class HomeController : Controller
        {
            private readonly ILogger<HomeController> _logger;
            private readonly IServices<User> _userServices;
            private readonly IServices<Role> _roleServices;
    
            public HomeController(ILogger<HomeController> logger, IServices<User> userServices, IServices<Role> roleServices)
            {
                _logger = logger;
                _userServices= userServices;
                _roleServices= roleServices;
            }
    
            public async Task<IActionResult> Index()
            {
                {
                    _logger.LogInformation($"{await _userServices.GetData()}");
                    _logger.LogInformation($"{await _userServices.GetObj()}");
                }
    
                {
                    _logger.LogInformation($"{await _roleServices.GetData()}");
                    _logger.LogInformation($"{await _roleServices.GetObj()}");
                }
    
                return View();
            }
        }

     项目整体结构

    友情链接:https://www.codenong.com/39320265/

  • 相关阅读:
    Laravel5.0学习--01 入门
    MySQL账户安全设置
    360路由器c301最新固件支持万能中继
    PsySH:PHP交互运行环境
    PHP-CS-Fixer:格式化你的PHP代码
    JVM 类加载机制详解
    Java虚拟机(JVM)概述
    聊一聊 Spring 中的线程安全性
    Java 里如何实现线程间通信
    Java 数据结构
  • 原文地址:https://www.cnblogs.com/sportsky/p/16253178.html
Copyright © 2020-2023  润新知