4

几十行代码实现ASP.NET Core自动依赖注入

 3 years ago
source link: https://www.cnblogs.com/boxrice/p/14664424.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

在开发.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的依赖注入容器中。

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

653862-20210415205518814-584346211.png

本文作者:青城同学

本文链接:https://www.cnblogs.com/boxrice/p/14664424.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK