這裏只談益處。web
部分來自官方文檔的一些建議安全
public class Service1 : IDisposable {} public class Service2 : IDisposable {} //方式一 public void ConfigureServices(IServiceCollection services) { services.AddSingleton<Service1>(); services.AddSingleton<IService2>(sp => new Service2()); } //方式二 public void ConfigureServices(IServiceCollection services) { services.AddSingleton<Service1>(new Service1()); services.AddSingleton(new Service2()); }
.NET CORE 3.x版本後,引入第三方IOC框架的方式變動了,這裏再也不貼出2.x的方式。以Autofac框架爲例。架構
Program.cs框架
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .UseServiceProviderFactory(new AutofacServiceProviderFactory()) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>() .ConfigureLogging((hostingContext, logging) => { logging.ClearProviders(); logging.AddConsole(); logging.AddNLog(); }); });
Startup.cs異步
//原來的 ConfigureServices保留,也可使用原來的框架繼續注入
public void ConfigureServices(IServiceCollection services) { services.AddControllers(); services.AddMemoryCache(); services.Configure<List<string>>(Configuration.GetSection("BlackPhoneList")); services.Configure<Dictionary<string, string>>(Configuration.GetSection("BusinessMessages")); } //增長ConfigureContainer(ContainerBuilder builder) 方式,使用Autofac框架注入 public void ConfigureContainer(ContainerBuilder builder) { builder.RegisterType<PhoneBlackListValidator>().Named<IPhoneValidator>("PHONE_BLACKLIST").SingleInstance(); builder.RegisterType<PhonePerDayCountValidator>().Named<IPhoneValidator>("PHONE_PERDAYCOUNT").SingleInstance(); builder.RegisterType<UniqueIdPerDayCountValidator>().Named<IUniqueIdValidator>("UNIQUEID_PERDAYCOUNT").SingleInstance(); //可遍歷類型注入,注意 只支持IEnumerable\IList\ICollection 類型 builder.RegisterType<MessageSendValidator>().As<IMessageSendValidator>().SingleInstance(); }
3.x 主要是在IServiceCollection和IServiceProvider之間增長了一個 ContainerBuilder 容器適配,使得第三方IOC框架引入更加合理了。具體實現原理能夠網上源碼查找。async