.NET Core3.0 Autofac注入


參考地址:https://docs.autofac.org/en/latest/examples/index.html

 

1. nuget :Autofac.Extensions.DependencyInjection  Autofac.Extras.DynamicProxy

2. 

using System.IO;
using Autofac.Extensions.DependencyInjection;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;

namespace DL.Admin
{
    public class Program
    {
        public static void Main(string[] args)
        {
            Host.CreateDefaultBuilder(args)
              .UseServiceProviderFactory(new AutofacServiceProviderFactory())
              .ConfigureWebHostDefaults(webBuilder =>
              {
                  webBuilder
                      .UseContentRoot(Directory.GetCurrentDirectory())
                      .UseUrls("http://*:2020")
                      .UseStartup<Startup>();
              });
        }
    }
}

3. 啟動文件Startup.cs內部添加以下方法

 public void ConfigureContainer(ContainerBuilder builder)
        {
            //添加任何Autofac模塊或注冊。
            //這是在ConfigureServices之后調用的,所以
            //在此處注冊將覆蓋在ConfigureServices中注冊的內容。
            //在構建主機時必須調用“UseServiceProviderFactory(new AutofacServiceProviderFactory())”`否則將不會調用此。
             
            builder.RegisterModule(new AutofacModuleRegister(Microsoft.DotNet.PlatformAbstractions.ApplicationEnvironment.ApplicationBasePath, new List<string>()
                    { //批量構造函數注入
                                "DL.Service.dll",
                    }));
 
            builder.RegisterType<Log4netService>()
                   .As<ILogService>()
                   .PropertiesAutowired()//開始屬性注入
                   .InstancePerLifetimeScope();//即為每一個依賴或調用創建一個單一的共享的實例

            builder.RegisterType<JwtService>()
                   .As<ITokenService>()
                   .PropertiesAutowired()//開始屬性注入
                   .InstancePerLifetimeScope();//即為每一個依賴或調用創建一個單一的共享的實例

        }

3. 創建下面類,進行批量注入

using Autofac;
using Autofac.Extras.DynamicProxy;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using Module = Autofac.Module;

namespace DL.Utils.Autofac
{
	public class AutofacModuleRegister : Module
    {
        public string RootPath { get; set; }
        public List<string> DllFiles { get; set; }
        public AutofacModuleRegister(string rootPath, List<string> dllFiles)
        {
            RootPath = rootPath;
            DllFiles = dllFiles;
        }
         
        protected override void Load(ContainerBuilder builder)
		{   
            foreach (var dllFile in DllFiles)
			{
				var dllFilePath = Path.Combine(RootPath, dllFile);//獲取項目絕對路徑
				builder.RegisterAssemblyTypes(Assembly.LoadFile(dllFilePath))//直接采用加載文件的方法
					   //.PropertiesAutowired()//開始屬性注入
					   //.Where(t => t.Name.EndsWith("Service") || t.Name.EndsWith("Repository"))
					   .AsImplementedInterfaces()//表示注冊的類型,以接口的方式注冊不包括IDisposable接口
					   .EnableInterfaceInterceptors()//引用Autofac.Extras.DynamicProxy,使用接口的攔截器,在使用特性 [Attribute] 注冊時,注冊攔截器可注冊到接口(Interface)上或其實現類(Implement)上。使用注冊到接口上方式,所有的實現類都能應用到攔截器。
					   .InstancePerLifetimeScope();//即為每一個依賴或調用創建一個單一的共享的實例
			}

			////攔截器
			////builder.Register(c => new AOPTest());
			////注入類
			////builder.RegisterType<UsersService>().As<UsersIService>().PropertiesAutowired().EnableInterfaceInterceptors();

			////程序集注入
			//var IRepository = Assembly.Load("DL.IRepository");
			//var Repository = Assembly.Load("DL.Repository"); 
			//Assembly.GetExecutingAssembly();
			////根據名稱約定(倉儲層的接口和實現均以Repository結尾),實現服務接口和服務實現的依賴
			//builder.RegisterAssemblyTypes(IRepository, Repository)
			//  .Where(t => t.Name.EndsWith("Repository"))
			//  .AsImplementedInterfaces();

		 
		}
	}
}

  4. Startup.cs的ConfigureServices 方法添加

 services.AddControllersWithViews()
            .AddControllersAsServices();//這里要寫

 4. Startup.cs的Configure 方法添加進行測試 

            using (var container = host.Services.CreateScope())
            {
                //ICacheService phone = container.ServiceProvider.GetService<ICacheService>();
                //phone.Set<string>("1", "123");
                ILogService log = container.ServiceProvider.GetService<ILogService>();
                log.Debug(typeof(string), "mesg", new[] { "1", "2" });

                //var str = phone.Get<string>("1");

                IService.SysIservice.ISysAdminService sysAdminService = container.ServiceProvider.GetService<IService.SysIservice.ISysAdminService>();

                var list = sysAdminService.GetListAsync();
            }

  


免責聲明!

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



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