在ASP.NET Core中實現自動注入、批量注入

咱們在使用AddScoped、AddTransient、AddSingleton這類方法的時候非常麻煩。咱們每增長一個接口以及其實現的時候,是否是須要在這裏硬編碼註冊一行代碼呢?項目小還好,但當咱們的項目變得龐大以後,這裏的依賴注入怎麼來維護呢?
在網上翻了半天,看了不少方法,其代碼的實現我的感受都不是太優雅,想一想仍是本身寫一個比較實用吧,咱們只需按照一個規定來定義和實現接口。應用程序就能自動掃描並註冊這些程序集中的接口和對應實現類,完成依賴注入的自動註冊,具體的實現能夠經過接口或特性來實現,若是須要區分AddScoped、AddTransient、AddSingleton能夠經過定義不一樣的接口去實現,這裏咱們定義IDenpendency接口作演示,具體實現以下: ide

第一步:建立以下這樣一個空接口this

public interface IDenpendency { }

第二步:建立須要注入的功能接口,這類接口就是你想實現某些功能的封裝,它們都繼承第一步建立的接口IDenpendency,以下,我建立一個功能接口編碼

public interface IUserService:IDenpendency
{
  //function
}

第三步:實現須要注入的功能接口,以下,我建立了一個實現UserService的類spa

public class UserService:IUserService 
{
  //function的具體實現
}

 第四步:擴展IServiceCollection批量注入方法AddDataServicecode

    public static class DataServiceExtension
    {
        /// <summary>
        /// 注入數據
        /// </summary>
        /// <param name="services"></param>
        public static IServiceCollection AddDataService(this IServiceCollection services)
        {
            #region 依賴注入
            //services.AddScoped<IUserService, UserService>();
            var baseType = typeof(IDependency);
            var path = AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory;
            var referencedAssemblies = System.IO.Directory.GetFiles(path, "*.dll").Select(Assembly.LoadFrom).ToArray();
            var types = referencedAssemblies
                .SelectMany(a => a.DefinedTypes)
                .Select(type => type.AsType())
                .Where(x => x != baseType && baseType.IsAssignableFrom(x)).ToArray();
            var implementTypes = types.Where(x => x.IsClass).ToArray();
            var interfaceTypes = types.Where(x => x.IsInterface).ToArray();
            foreach (var implementType in implementTypes)
            {
                var interfaceType = interfaceTypes.FirstOrDefault(x => x.IsAssignableFrom(implementType));
                if (interfaceType != null)
                    services.AddScoped(interfaceType, implementType);
            }
            
            #endregion

            return services;
        }
    }
View Code

第五步:在Startup.cs調用AddDataService方法進行批量注入blog

 

 

 

 本人原創文章,非商業用途可隨意轉載,轉載請保留原文出處 繼承

相關文章
相關標籤/搜索