1. 程式人生 > 實用技巧 >.NET CORE3.1使用內建IOC自動注入

.NET CORE3.1使用內建IOC自動注入

在.NET CORE中注入時需要在Startup的ConfigureServices中寫
services.AddScoped<IServices, Services>();

專案如果比較大,每次寫起來就會很麻煩,所以需要讓程式可以自動注入

首先新建兩個介面 IDenpendency,IDenpendcySingleton,或者使用特性也可以。
    /// <summary>
    /// 使用Scoped方式注入
    /// </summary>
    public interface IDenpendency
    {
    }

    /// <summary>
    /// 使用Singleton方式注入
    /// </summary>
    public interface IDenpendcySingleton
    {
    }
    /// <summary>
    /// 業務介面繼承其中一個
    /// </summary>
    public interface IStockInAppService: IDenpendency
    {
    }
在web專案中新建一個DIDataService的靜態類
    public static class DIDataService
    {
        public static IServiceCollection AddDataService(this IServiceCollection services)
        {
            #region 處理依賴注入
            var transientType = typeof(IDenpendency); //每次新建
            var singletonType = typeof(IDenpendcySingleton); //全域性唯一

            var allTypes = AppDomain.CurrentDomain.GetAssemblies()
                //.FirstOrDefault(t => t.FullName.Contains("AbpCore.InterfaceServices.Application"))
                ////獲取所有物件
                //.GetTypes()
                .SelectMany(a => a.GetTypes().Where(t => t.GetInterfaces().Contains(transientType) || t.GetInterfaces().Contains(singletonType)));

            //class的程式集
            var implementTypes = allTypes.Where(x => x.IsClass).ToArray();
            //介面的程式集
            var interfaceTypes = allTypes.Where(x => x.IsInterface).ToArray();

            foreach (var implementType in implementTypes)
            {
                var interfaceType = interfaceTypes.FirstOrDefault(x => x.IsAssignableFrom(implementType));
                //class有介面,用介面注入
                if (interfaceType != null)
                {
                    //判斷用什麼方式注入
                    if (interfaceType.GetInterfaces().Contains(transientType))
                    {
                        services.AddScoped(interfaceType, implementType);
                    }
                    else if (interfaceType.GetInterfaces().Contains(singletonType))
                    {
                        services.AddSingleton(interfaceType, implementType);
                    }
                }
                else //class沒有介面,直接注入class
                {
                    //判斷用什麼方式注入
                    if (implementType.GetInterfaces().Contains(transientType))
                    {
                        services.AddTransient(implementType);
                    }
                    else if (implementType.GetInterfaces().Contains(singletonType))
                    {
                        services.AddSingleton(implementType);
                    }
                }
            }
            #endregion
            return services;
        }
    }
最後在Startup的ConfigureServices中注入DIDataService
services.AddDataService();

這樣就可以自動注入了,不用再操心注入啦