手把手教你寫DI_1_DI框架有什麼?

DI框架有什麼?

在上一節:手把手教你寫DI_0_DI是什麼?html

咱們已經理解DI是什麼app

接下來咱們就徒手擼一擼,玩個支持構造函數注入的DI出來框架

首先咱們回顧一下 構造函數注入 的代碼形式, 大概長這模樣:ide

class MovieLister 
{
   private IMovieFinder finder;

   public MovieLister(IMovieFinder finder) {
    this.finder = finder;
  }
}

那麼咱們就能夠動手擼了函數

Emmmm...ui

等等,這個finder 從哪來? 咱們本身new嗎?本身new,咱們還要DI幹什麼?又不是找對象this

好吧,咱們參照一下Microsoft.Extensions.DependencyInjection的設計,畢竟咱們是小白,什麼都不懂設計

其使用例子大體是這樣:code

var provider = new ServiceCollection()   // 聲明服務定義集合,能夠理解爲 咱們你們公司初創,要列出咱們要招聘哪些人才幹活
                
                .AddTransient<IXX,XX>()  // 添加一個瞬態的服務定義,也就是咱們的招聘廣告
                                         // 對你們這些老闆來講能夠把 XX 這個「人」(類) 當成 IXX 這種「畜生」(接口)同樣奴役,好比咱們廣告就是要個長得漂亮,手藝好,會IXX的搬磚工
                                         // 瞬態能夠理解成 咱們的這份活兒比較危險,一我的幹完一次以後就無法再幹了,因此每次有活兒,咱們都得從新招人
                
                .BuildServiceProvider(); // 這是建立DI構造入口,能夠理解成咱們把招聘廣告交給人才市場了,每次咱們要幹什麼活兒,就能夠打個電話叫人啦

var xx = provider.GetService(typeof(IXX));  // 等同於咱們打個電話:喂,人才市場的蛇頭嗎? 咱們要個會IXX的搬磚的。 等一下子,蛇頭就把會IXX送上咱們的門啦
xx.DoSomethings();  // 等同於 xx 你去給我搬磚

哦哦哦,咱們就是要擼這樣的東西出來嗦server

那咱們看看每一個都長啥鬼模樣

ServiceCollection :

public class ServiceCollection : IServiceCollection
    {
    }

    //
    // Summary:
    //     Specifies the contract for a collection of service descriptors.
    public interface IServiceCollection : IList<ServiceDescriptor>, ICollection<ServiceDescriptor>, IEnumerable<ServiceDescriptor>, IEnumerable
    {
    }

哦哦,就是 ServiceDescriptor 集合嘛

AddTransient

public static IServiceCollection AddTransient<TService, TImplementation>(...

    var descriptor = new ServiceDescriptor(serviceType, implementationFactory, lifetime);
    collection.Add(descriptor);
    return collection;

哦哦,也就是 add ServiceDescriptor

ServiceDescriptor

public class ServiceDescriptor
{
    public ServiceDescriptor(Type serviceType, Type implementationType, ServiceLifetime lifetime);
...

//
// Summary:
//     Specifies the lifetime of a service in an Microsoft.Extensions.DependencyInjection.IServiceCollection.
public enum ServiceLifetime
{
    //
    // Summary:
    //     Specifies that a single instance of the service will be created.
    Singleton = 0,
    //
    // Summary:
    //     Specifies that a new instance of the service will be created for each scope.
    //
    // Remarks:
    //     In ASP.NET Core applications a scope is created around each server request.
    Scoped = 1,
    //
    // Summary:
    //     Specifies that a new instance of the service will be created every time it is
    //     requested.
    Transient = 2
}

哦哦哦,ServiceDescriptor 就是一些描述嘛

BuildServiceProvider 呢 ?

public static IServiceProvider BuildServiceProvider(this IServiceCollection services) {
    ...
    return new ServiceProvider(xxx);
}

//
// Summary:
//     Defines a mechanism for retrieving a service object; that is, an object that
//     provides custom support to other objects.
public interface IServiceProvider
{
    //
    // Summary:
    //     Gets the service object of the specified type.
    //
    // Parameters:
    //   serviceType:
    //     An object that specifies the type of service object to get.
    //
    // Returns:
    //     A service object of type serviceType. -or- null if there is no service object
    //     of type serviceType.
    object GetService(Type serviceType);
}

索嘎,咱們實現這些抽象就好啦

來,讓咱們思考一下,怎麼擼成這些抽象的實現

下一章咱們再討論

下一章 徒手擼構造函數注入

相關文章
相關標籤/搜索