1. 程式人生 > >手把手教你寫DI_1_DI框架有什麽?

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

這樣的 desc inject var .net 框架 抽象 幹什麽 depend

DI框架有什麽?

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

我們已經理解DI是什麽

接下來我們就徒手擼一擼,玩個支持構造函數註入的DI出來

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

class MovieLister 
{
   private IMovieFinder finder;

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

那麽我們就可以動手擼了

Emmmm...

等等,這個finder 從哪來? 我們自己new嗎?自己new,我們還要DI幹什麽?又不是找對象

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

其使用例子大致是這樣:

var provider = new ServiceCollection()   // 聲明服務定義集合,可以理解為 我們大家公司初創,要列出我們要招聘哪些人才幹活
                
                .AddTransient<IXX,XX>()  // 添加一個瞬態的服務定義,也就是我們的招聘廣告
                                         // 對大家這些老板來說可以把 XX 這個“人”(類) 當成 IXX 這種“畜生”(接口)一樣奴役,比如我們廣告就是要個長得漂亮,手藝好,會IXX的搬磚工
                                         // 瞬態可以理解成 我們的這份活兒比較危險,一個人幹完一次之後就沒法再幹了,所以每次有活兒,我們都得重新招人
                
                .BuildServiceProvider(); // 這是創建DI構造入口,可以理解成我們把招聘廣告交給人才市場了,每次我們要幹什麽活兒,就可以打個電話叫人啦

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

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

那我們看看每個都長啥鬼模樣

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);
}

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

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

下一章我們再討論

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

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