在上一節:手把手教你寫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); }
索嘎,咱們實現這些抽象就好啦
來,讓咱們思考一下,怎麼擼成這些抽象的實現
下一章咱們再討論