zoukankan      html  css  js  c++  java
  • 几十行代码实现ASP.NET Core自动依赖注入

    在开发.NET Core web服务的时候,我们习惯使用自带的依赖注入容器来进行注入。

    于是就会经常进行一个很频繁的的重复动作:定义一个接口->写实现类->注入

    有时候会忘了写Add这一步,看到屏幕上的报错一脸懵逼,然后瞬间反应过来忘了注入了。赶紧补上serviceCollection.AddXXX这句话

    虽然说有很多开源框架已经实现了类似的工作,比如AutoFac,Unity等依赖注入框架。但是这些库都太庞大了,我个人还是喜欢轻量级的实现。

    定义一个枚举

    
    [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
        public class AutoInjectAttribute : Attribute
        {
            public AutoInjectAttribute(Type interfaceType, InjectType injectType)
            {
                Type = interfaceType;
                InjectType = injectType;
            }
    
            public Type Type { get; set; }
    
            /// <summary>
            /// 注入类型
            /// </summary>
            public InjectType InjectType { get; set; }
        }
    
    

    定义三种注入类型

    
    /// <summary>
        /// 注入类型
        /// </summary>
        public enum InjectType
        {
            Scope,
            Single,
            Transient
        }
    
    

    扫描运行目录下所有的dll,进行自动注入

    
    /// <summary>
        /// 自动依赖注入
        /// </summary>
        public static class AutoInject
        {
            /// <summary>
            /// 自动注入所有的程序集有InjectAttribute标签
            /// </summary>
            /// <param name="serviceCollection"></param>
            /// <returns></returns>
            public static IServiceCollection AddAutoDi(this IServiceCollection serviceCollection)
            {
                var path = AppDomain.CurrentDomain.BaseDirectory;
                var assemblies = Directory.GetFiles(path, "*.dll").Select(Assembly.LoadFrom).ToList();
                foreach (var assembly in assemblies)
                {
                    var types = assembly.GetTypes().Where(a => a.GetCustomAttribute<AutoInjectAttribute>() != null)
                        .ToList();
                    if (types.Count <= 0) continue;
                    foreach (var type in types)
                    {
                        var attr = type.GetCustomAttribute<AutoInjectAttribute>();
                        if (attr?.Type == null) continue;
                        switch (attr.InjectType)
                        {
                            case InjectType.Scope:
                                serviceCollection.AddScoped(attr.Type, type);
                                break;
                            case InjectType.Single:
                                serviceCollection.AddSingleton(attr.Type, type);
                                break;
                            case InjectType.Transient:
                                serviceCollection.AddTransient(attr.Type, type);
                                break;
                            default:
                                throw new ArgumentOutOfRangeException();
                        }
                    }
                }
    
                return serviceCollection;
            }
        }
    
    

    使用自动依赖注入功能

    
       public void ConfigureServices(IServiceCollection services)
            {
                services.AddAutoDi();
            }
    
    
    
      public interface ITest
        {
            string Say();
        }
    
        [AutoInject(typeof(ITest),InjectType.Scope)]
        public class Test : ITest
        {
            public String Say()
            {
                return "test:"+DateTime.Now.ToString();
            }
        }
    
    

    再次运行程序,所有的贴有AutoInject的所有的实现类,都会被注入到asp.net core的依赖注入容器中。

    欢迎关注我的公众号 青城同学 ,不定时和你分享一些技术和有趣的事情。

  • 相关阅读:
    黑马程序员_网络编程
    黑马程序员_ 异常
    黑马程序员_面向对象基础
    黑马程序员_循环语句的使用
    黑马程序员_面向对象深入2
    黑马程序员_ JAVA中的多线程
    黑马程序员_JAVA基础知识总结3
    OC-内存管理
    OC-核心语法(3)(分类、SEL、类本质)
    OC-核心语法2-构造方法
  • 原文地址:https://www.cnblogs.com/boxrice/p/14664424.html
Copyright © 2011-2022 走看看