asp.net core ioc 依賴注入
阿新 • • 發佈:2018-12-01
1.生命週期
內建的IOC有三種生命週期:
Transient: Transient服務在每次被請求時都會被建立。這種生命週期比較適用於輕量級的無狀態服務。
Scoped: Scoped生命週期的服務是每次web請求被建立。
Singleton: Singleton生命能夠週期服務在第一被請求時建立,在後續的每個請求都會使用同一個例項。如果你的應用需要單例服務,推薦的做法是交給服務容器來負責單例的建立和生命週期管理,而不是自己來走這些事情。
在Startup的ConfigureServices方法中
呼叫方法
services.AddSingleton(typeof(IMyService),new MyService());
也可以services.AddSingleton(typeof(IMyService),typeof(MyService));
最好還是services.AddSingleton<IMyService, MyService>();
因為這樣的話可以在MyService中通過建構函式注入其他服務。
2.註冊程式集的所有類
//通過反射把所有服務介面進行了注入: var serviceAsm = Assembly.Load(new AssemblyName("Service")); foreach (Type serviceType in serviceAsm.GetTypes() .Where(t => typeof(IServiceTag).IsAssignableFrom(t) && !t.GetTypeInfo().IsAbstract)) { var interfaceTypes = serviceType.GetInterfaces(); foreach (var interfaceType in interfaceTypes) { services.AddSingleton(interfaceType, serviceType); } }
3.其他類注入
在其他類怎麼使用注入?假如在ExceptionFilter中想呼叫IUserService怎麼辦?要確保ExceptionFilter不是new出來的,而是IOC創建出來
services.AddSingleton<ExceptionFilter>(); //mvc core中註冊filter要在AddMvc的回撥方法中註冊。 services.AddMvc(options => { var serviceProvider = services.BuildServiceProvider(); var filter = serviceProvider.GetService<ExceptionFilter>(); options.Filters.Add(filter); }).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);