.Net Core 自動掃描注入之Scrutor批量依賴注入


.NET Core中依賴注入已經是最常見的編程方式,所以基於約定進行自動依賴注入非常有必要,可以簡化工作量和減少出錯的概率,

目前進行自動掃描注入的工具為Scrutor,通過一個接口錨點進行自動掃描注入,如下述的IAutoInject,IScopedAutoInject   等接口就是錨點

分為2種注入方式:

1.接口實現類型的注入,如services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

2.注入自身    services.AddScoped<RequestToHttpHelper>();

其中:

1.IAutoInject :默認以接口和實現的方式注入Scoped 例:services.AddScoped<ITest, TestImplment>();

2.IScopedAutoInject  :以接口和實現的方式注入Scoped(同上)例:services.AddScoped<ITest, TestImplment>();

3.ISingletonAutoInject:自動注入接口和實現Singleton類型 例:services.AddSingleton<ITest, TestImplment>();

4.ITransientAutoInject:自動注入接口和實現Transient類型  例:services.AddTransient<ITest, TestImplment>();

5.ISelfScopedAutoInject:自動注入自身Scoped類型  例:services.AddScoped<Test>();

6.ISelfSingletonAutoInject:自動注入自身Singleton類型 例:services.AddSingleton<Test>();

7.ISelfTransientAutoInject:自動注入自身Transient類型 例:services.AddTransient<Test>();

代碼如下:

using Microsoft.Extensions.DependencyInjection;
using Scrutor;
using System.Reflection;
using System.Collections.Generic;
using System.Linq;
using Microsoft.AspNetCore.Http;

namespace NetCore3WebApiTemplate
{
    public static class RegisterService
    {
        public static void RegisterComponents(IServiceCollection services)
        {
           
            //自動注入IAutoInject
            services.Scan(x =>
            {
                var entryAssembly = Assembly.GetEntryAssembly();
                var referencedAssemblies = entryAssembly.GetReferencedAssemblies().Select(Assembly.Load);
                var assemblies = new List<Assembly> { entryAssembly }.Concat(referencedAssemblies);

                x.FromAssemblies(assemblies)
                    .AddClasses(classes => classes.AssignableTo(typeof(IAutoInject)))
                        .AsImplementedInterfaces()
                        .WithScopedLifetime()
                        //接口注冊Scoped
                    .AddClasses(classes => classes.AssignableTo(typeof(IScopedAutoInject)))
                        .AsImplementedInterfaces()
                        .WithScopedLifetime()
                    //接口注冊Singleton
                    .AddClasses(classes => classes.AssignableTo(typeof(ISingletonAutoInject)))
                          .AsImplementedInterfaces()
                          .WithSingletonLifetime()
                   //接口注冊Transient
                    .AddClasses(classes => classes.AssignableTo(typeof(ITransientAutoInject)))
                          .AsImplementedInterfaces()
                          .WithTransientLifetime()
                    //具體類注冊Scoped
                    .AddClasses(classes => classes.AssignableTo(typeof(ISelfScopedAutoInject)))
                          .AsSelf()
                          .WithScopedLifetime()
                    //具體類注冊Singleton
                    .AddClasses(classes => classes.AssignableTo(typeof(ISelfSingletonAutoInject)))
                          .AsSelf()
                          .WithSingletonLifetime()
                    //具體類注冊Transient
                    .AddClasses(classes => classes.AssignableTo(typeof(ISelfTransientAutoInject)))
                          .AsSelf()
                          .WithTransientLifetime();
            });
        }
    }
}

  

using System;
using System.Collections.Generic;
using System.Text;

namespace NetCore3WebApiTemplate
{
    /// <summary>
    /// 自動注入掃描點默認為Scoped
    /// </summary>
    public interface IAutoInject
    {
    }

    /// <summary>
    ///  自動注入接口和實現Scoped類型
    /// </summary>
    public interface IScopedAutoInject
    {

    }

    /// <summary>
    /// 自動注入接口和實現Singleton類型
    /// </summary>
    public interface ISingletonAutoInject
    {

    }

    /// <summary>
    /// 自動注入接口和實現Transient類型
    /// </summary>
    public interface ITransientAutoInject
    {

    }

    /// <summary>
    /// 自動注入自身Scoped類型
    /// </summary>
    public interface ISelfScopedAutoInject
    {

    }

    /// <summary>
    /// 自動注入自身Singleton類型
    /// </summary>
    public interface ISelfSingletonAutoInject
    {

    }

    /// <summary>
    /// 自動注入自身Transient類型
    /// </summary>
    public interface ISelfTransientAutoInject
    {

    }
}

 

使用方式如下:

public class TestImplment:ITest,IAutoInject
{
    
}

 

 public class CompanyController : ControllerBase
    {
        private readonly ITest test;

        public CompanyController(ITest test)
        {
            this.test= test;
        }
    }

 

 在startup的ConfigureServices的方法追加RegisterService.RegisterComponents(services);即可,代碼如下

/// <summary>
        /// This method gets called by the runtime. Use this method to add services to the container.
        /// </summary>
        /// <param name="services"></param>
        public void ConfigureServices(IServiceCollection services)
        {
           //注冊服務
            RegisterService.RegisterComponents(services);
       }

  

 注意:RegisterService所在項目需要引用需要掃描的注入接口和類,不然無法掃描到。

 

 

  沒有英漢互譯結果
   請嘗試網頁搜索


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM