netcore 2.2 使用 Autofac 實現自動注入


Autofac自動注入是通過名稱約定來實現依賴注入

ps:本demo接口層都以“I”開頭,以“Service”結尾。服務層實現都以“Service”結尾。

為什么要實現自動注入

大多時候,我們都是 以下方式進行依賴注入

        public IServiceProvider ConfigureServices(IServiceCollection services)
        {
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
            //初始化容器
            var builder = new ContainerBuilder();
            //管道寄居
            builder.Populate(services);
            builder.RegisterType<TestService>().As<ITestService>();//UserService注入到IUserService
            //構造
            ApplicationContainer = builder.Build();
            //將AutoFac反饋到管道中
            return new AutofacServiceProvider(ApplicationContainer);
        }

隨着業務的增長,接口跟實現類會越來越多,還需要手動一個個的注冊依賴項,有時候會出現忘了寫配置,導致程序報錯,如果是多人開發,可能還會導致代碼沖突,后期維護起來相對來說比較麻煩。

實用Autofac自動注入

        public IServiceProvider ConfigureServices(IServiceCollection services)
        {
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
            //初始化容器
            var builder = new ContainerBuilder();
            //管道寄居
            builder.Populate(services);
            //業務邏輯層所在程序集命名空間
            Assembly service = Assembly.Load("NetCoreDemo.Service");
            //接口層所在程序集命名空間
            Assembly repository = Assembly.Load("NetCoreDemo.Repository");
            //自動注入
            builder.RegisterAssemblyTypes(service, repository)
                .Where(t => t.Name.EndsWith("Service"))
                .AsImplementedInterfaces();
            //構造
            ApplicationContainer = builder.Build();
            //將AutoFac反饋到管道中
            return new AutofacServiceProvider(ApplicationContainer);
        }

簡單測試

創建IUserService接口

    public interface ITestService
    {
        string Hello();
    }

創建UserService實現類

    public class TestService : ITestService
    {
        public string Hello()
        {
            return "Hello Word";
        }
    }

創建TestController控制器

通過控制器的構造方法注入ITestService接口

    [Route("api/test")]
    [ApiController]
    public class TestController : Controller
    {
        private readonly ITestService _testService;
        /// <summary>
        /// 構造函數
        /// </summary>
        /// <param name="testService"></param>
        public TestController(ITestService testService)
        {
            _testService = testService;
        }
        [HttpGet]
        public string Hello()
        {
           var str= _testService.Hello();
           return str;
        }
    }

運行


免責聲明!

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



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