C# 依賴注入IServiceCollection的AddSingleton方法使用

皮皮君發表於2020-05-22

AddSingleton(IServiceCollection, Type, Func<IServiceProvider,Object>)方法

這個方法是通過提供一個Func<IServiceProvider,Object>的delegate委託來實現服務的例項獲取。具體怎麼用,下面給一個簡單例子:

using System;
using Microsoft.Extensions.DependencyInjection;

class Program
{

    interface ITianChao
    {
        void hello();
    }
    class TianChao:ITianChao
    {
        public int A{get;set;}
        public int B{get;set;}
        public TianChao(int a, int b)
        {
            A = a;
            B = b;
        }

        void ITianChao.hello()
        {
            System.Console.WriteLine("hello");
        }
    }

    class Hongse
    {
        public TianChao GetTC()
        {
            return new TianChao(44,55);
        }
    }

    static void Main(string[] args)
    {
        IServiceCollection services = new ServiceCollection();
        services.AddSingleton(typeof(TianChao), sp => {
            var hs = sp.GetService<Hongse>();
            return hs.GetTC();
        });
        services.AddSingleton(new Hongse());
        IServiceProvider serviceProvider = services.BuildServiceProvider();
        object mything = serviceProvider.GetService<TianChao>();
    }
}

當程式碼執行到最後一行serviceProvider.GetService()的時候,會去呼叫執行AddSinglenton()方法提供的delegate委託程式碼(也就是39-40行程式碼),委託程式碼傳入的引數sp就是程式碼中建立的serviceProvider本身,執行完畢返回需要的服務物件。
因此AddSingleton(IServiceCollection, Type, Func<IServiceProvider,Object>)這個過載便於我們利用已經存在服務容器中的服務來生成需要取得的服務物件。

相關文章