NET Core擴展IServiceCollection自動注冊服務
前言
在ASP.NET Core中使用依賴注入中使用很簡單,只需在Startup類的ConfigureServices()方法中,通過IServiceCollection接口進行注入即可,其它的無需關心。
通過接口的Add*方法進行注冊,代碼如下:
1 public void ConfigureServices(IServiceCollection services) 2 { 3 services.AddSingleton<IUser, MyUser>(); 4 }
但是這樣的注入方法多了之后,就會產生太多行的services.Add...方法,看着實在是不爽;
回想起MEF,只需要兩個約定好的特性就可以完成注冊和注入的聲明,比起現在一行行注冊方式,簡直不要太好。
所以我對IServiceCollection接口進行了擴展,讓它能與MEF類似的自動處理注冊類型,而且支持通過多種方式進行注冊。
我對接口進行了如下改造,讓它支持特性(attribute)、類型(繼承或接口)、名稱、命名空間、程序集名等進行批量的注冊。
展示一下特性注冊,在ConfigureServices加入如下:
services.Scan(scan => scan.FromAssemblyOf<IUser>() .AddClasses().UsingAttributes());
這樣就完成了對IUser所在程序集帶有ServiceDescriptor特性的自動注冊,並且可以通過ServiceLifetime進行生命周期管理:
public interface IUser { string Name { set; get; } } [ServiceDescriptor(typeof(IUser),ServiceLifetime.Transient)] public class MyUser : IUser { public string Name { set; get; } }
這樣在使用ServiceProvoider.GetService(typeof(IUser)),就可以取到MyUser類型實例了。
以上只是演示了特性注入的方式,還有很多玩法,在Github上YOYO.Extensions.DI項目下:
https://github.com/maxzhang1985/YOYOFx/tree/master/AspNetCore/YOYO.Extensions.DI
YOYOFx還非常不完善,只完成了最基本的功能,不過我會堅持寫下去,堅持開源,為開源社區做那么一點點的貢獻。
GitHub:https://github.com/maxzhang1985/YOYOFx 如果覺還可以請Star下,