手把手教你寫DI_1_DI框架有什麽?
阿新 • • 發佈:2018-11-07
這樣的 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框架有什麽?