1. 程式人生 > >asp.net core ioc 依賴注入

asp.net core ioc 依賴注入

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);