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; } }
運行