Autofac自動註入是通過名稱約定來實現依賴註入 ps:本demo介面層都以“I”開頭,以“Service”結尾。服務層實現都以“Service”結尾。 為什麼要實現自動註入 大多時候,我們都是 以下方式進行依賴註入 public IServiceProvider ConfigureService ...
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; } }
運行