文章出處

之前都是在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控制臺程序中使用依賴注入的問題就這么解決了。


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()