之前都是在ASP.NET Core中使用依賴注入(Dependency Injection),昨天遇到一個場景需要在.NET Core控制臺程序中使用依賴注入,由于對.NET Core中的依賴注入機制不了解,竟然無從下手。
今天正準備閱讀 Microsoft.Extensions.DependencyInjection 的源代碼,發現園子里的一篇博文 ASP.NET Core 源碼閱讀筆記(1) ---Microsoft.Extensions.DependencyInjection,讀后豁然開朗,遇到的問題也隨之解決。
在ASP.NET Core中使用依賴注入中使用很簡單,只需在Startup類的ConfigureServices()方法中,通過IServiceCollection接口進行注入即可,其它的無需關心。
public void ConfigureServices(IServiceCollection services) { services.AddSingleton<IMemcachedClient, MemcachedClient>(); }
而在控制臺程序中就不一樣了,除了注入外,你還需要構建容器,解析注入。注入通過IServiceCollection接口,而構建容器需要調用IServiceCollection的擴展方法BuildServiceProvider(),解析需要調用IServiceProvider的擴展方法GetService<T>()。示例代碼如下:
public class Program { public static void Main(string[] args) { IServiceCollection services = new ServiceCollection(); //注入 services.AddTransient<IMemcachedClient, MemcachedClient>(); //構建容器 IServiceProvider serviceProvider = services.BuildServiceProvider(); //解析 var memcachedClient = serviceProvider.GetService<IMemcachedClient>(); Console.WriteLine(memcachedClient); } }
上面的代碼在運行時卻出現了下面的錯誤:
No constructor for type 'Enyim.Caching.MemcachedClient' can be instantiated using services from the service container and default values.
這是由于MemcachedClient的構造函數依賴ILoggerFactory接口:
public class MemcachedClient : IMemcachedClient { public MemcachedClient(ILoggerFactory logggerFactory) { _loggger = logggerFactory.CreateLogger<MemcachedClient>(); } }
在ASP.NET Core中,由于ASP.NET Core runtime已經幫你默認注冊了ILoggerFactory的實現,所以不需要自己注冊,但在控制臺程序中需要自己動手,添加如下的注入代碼:
services.AddTransient<ILoggerFactory, LoggerFactory>();
在.NET Core控制臺程序中使用依賴注入的問題就這么解決了。
文章列表