Asp.net Core依賴(lài)注入之(自帶的IOC容器)

今天我們主要講講如何使用自帶IOC容器,雖然自帶的功能不是那么強(qiáng)大,但是勝在輕量級(jí)..而且..不用引用別的庫(kù).

在新的ASP.NET Core中,大量的采用了依賴(lài)注入的方式來(lái)編寫(xiě)代碼.

比如,在我們的Startup類(lèi)中的ConfigureServices里,就可以看到:

AddMvc AddDbContext 包括我們之前目錄游覽用到的AddDirectoryBrowser..

都是框架提供好的服務(wù),我們直接注入就可以使用了.

如何注入自己的服務(wù)

目前有三種注入,各有不同:

  • Transient(瞬時(shí)的)
    每次請(qǐng)求時(shí)都會(huì)創(chuàng)建的瞬時(shí)生命周期服務(wù)。這個(gè)生命周期最適合輕量級(jí)沦疾,無(wú)狀態(tài)的服務(wù)垮耳。
  • Scoped(作用域的)
    創(chuàng)建的對(duì)象在同一個(gè)請(qǐng)求會(huì)話(huà)時(shí)是相同的跃须,每一個(gè)不同的會(huì)話(huà)創(chuàng)建一個(gè)不同的實(shí)例眷篇。
  • Singleton(唯一的)
    創(chuàng)建的對(duì)象在所有的地方所有的請(qǐng)求會(huì)話(huà)創(chuàng)建的都是不同的舆瘪。

如何使用這三種生命周期呢?.我們直接在注入的時(shí)候用不同的方法就行了,代碼如下:

services.AddTransient<ITestService, TestService>();
services.AddScoped<ITestService, TestService>();
services.AddSingleton<ITestService, TestService>();

編寫(xiě)服務(wù)

我這里寫(xiě)了一個(gè)查詢(xún)InfluxDb的服務(wù)池摧,就用這個(gè)作為例子來(lái)分析焦除。

  1. 首先定義接口,IInfluxDbService.cs,接口里面我只寫(xiě)了兩個(gè)接口作彤。
public interface IInfluxDbService
{
    void AddData(string tableName,
        Dictionary<string, object> tags,
        Dictionary<string, object> fields, DateTime timestamp);

    IList<IList<object>> GetData(string queries);
}
  1. 編寫(xiě)服務(wù),繼承自接口膘魄,InfluxDbService.cs
    可以看到帶了一個(gè)含參構(gòu)造函數(shù)乌逐,傳入數(shù)據(jù)庫(kù)地址及用戶(hù)密碼等必須信息。
    public class InfluxDbService:IInfluxDbService
    {
        //聲明InfluxDbClient
        private InfluxDbClient clientDb;
        private string dbName;

        public InfluxDbService(string infuxUrl, string dbName,string infuxUser, string infuxPwd)
        {
            this.dbName = dbName;
            clientDb = new InfluxDbClient(infuxUrl, infuxUser, infuxPwd, InfluxDbVersion.Latest);
        }
        /// <summary>
        /// 增加數(shù)據(jù)
        /// </summary>
        /// <param name="tableName">表名</param>
        /// <param name="tags">索引</param>
        /// <param name="fields">字段</param>
        /// <param name="timestamp">時(shí)間戳</param>
        public async void AddData(string tableName,
            Dictionary<string,object> tags,
            Dictionary<string,object> fields,DateTime timestamp)
        {
            //基于InfluxData.Net.InfluxDb.Models.Point實(shí)體準(zhǔn)備數(shù)據(jù)
            var pointModel = new Point();
            pointModel.Name = tableName;
            pointModel.Tags = tags;
            pointModel.Fields = fields;
            pointModel.Timestamp = timestamp;
           
            //從指定庫(kù)中寫(xiě)入數(shù)據(jù)创葡,支持傳入多個(gè)對(duì)象的集合
            var response = await clientDb.Client.WriteAsync(pointModel, this.dbName);
        }

        /// <summary>
        /// 查詢(xún)數(shù)據(jù)
        /// </summary>
        /// <param name="queries"></param>
        /// <returns>返回查詢(xún)結(jié)果</returns>
        public IList<IList<object>> GetData(string queries)
        {
            //從指定庫(kù)中查詢(xún)數(shù)據(jù)
            var response =  clientDb.Client.QueryAsync(queries, this.dbName);
            //得到Serie集合對(duì)象(返回執(zhí)行多個(gè)查詢(xún)的結(jié)果)
            var series = response.Result.ToList();
            var list = series[0].Values;
            return list;
        }
    }

這樣我們的服務(wù)就寫(xiě)完了浙踢,接下來(lái)就是如何注入服務(wù)。

依賴(lài)注入

我們可以在Startup類(lèi)中直接注入,比如灿渴,我這里就拿AddSingleton作為示例進(jìn)行演示洛波。

public void ConfigureServices(IServiceCollection services)
{
    //讀配置文件獲取參數(shù)
    var url = configuration.GetValue("InfluxDb:ConnectionString", "http://127.0.0.1:8086");
    var dbName = configuration.GetValue("InfluxDb:DatabaseName", "autocontrol");
    var userName = configuration.GetValue("InfluxDb:UserName", "admin");
    var password = configuration.GetValue("InfluxDb:Password", "admin");
    //注入依賴(lài)
    services.AddSingleton<IInfluxDbService, InfluxDbService>(a => new InfluxDbService(url, dbName, userName, password));
    //以下是系統(tǒng)自動(dòng)生成
    services.AddControllersWithViews();
    services.AddMvcCore().AddApiExplorer();
}

只因我這里加入了很多參數(shù),代碼就有一大坨了骚露,如果所有服務(wù)都這樣寫(xiě)蹬挤,可以想象下,如果服務(wù)很多棘幸,那么這個(gè)方法就會(huì)越來(lái)越長(zhǎng)焰扳,后期很難維護(hù),代碼看起來(lái)也不優(yōu)雅美觀(guān)误续,為了減少ConfigureServices這個(gè)函數(shù)體的長(zhǎng)度吨悍,我們可以把這一段封裝起來(lái)。

封裝擴(kuò)展服務(wù)

  1. 首先新建一個(gè)ServiceExtensions的靜態(tài)類(lèi)
    /// <summary>
    /// 服務(wù)擴(kuò)展類(lèi)
    /// </summary>
    public static class ServiceExtensions
    {
        /// <summary>
        /// 添加跨域
        /// </summary>
        /// <param name="services"></param>
        public static void ConfigureCors(this IServiceCollection services)
        {
            services.AddCors(options =>
            {
                options.AddPolicy("AllowAny", builder => builder.SetIsOriginAllowed(isOriginAllowed: _ => true)
                    .AllowAnyMethod()
                    .AllowAnyHeader()
                    .AllowCredentials());
            });
        }

        /// <summary>
        /// 注入InfluxDb服務(wù)
        /// </summary>
        /// <param name="services"></param>
        /// <param name="configuration"></param>
        public static void AddInfluxDbService(this IServiceCollection services, IConfiguration configuration)
        {
            //服務(wù)DI注入
            var url = configuration.GetValue("InfluxDb:ConnectionString", "http://127.0.0.1:8086");
            var dbName = configuration.GetValue("InfluxDb:DatabaseName", "autocontrol");
            var userName = configuration.GetValue("InfluxDb:UserName", "admin");
            var password = configuration.GetValue("InfluxDb:Password", "admin");

            services.AddSingleton<IInfluxDbService, InfluxDbService>(a => new InfluxDbService(url, dbName, userName, password));

        }
    }

我這里封裝了兩個(gè)服務(wù)女嘲。

  • ConfigureCors:跨域的服務(wù)
  • AddInfluxDbService:InfluxDb的服務(wù)
public void ConfigureServices(IServiceCollection services)
{
    //設(shè)置跨域處理
    services.ConfigureCors();
    //注入服務(wù)
    services.AddInfluxDbService(Configuration);

    services.AddControllersWithViews();
            
    services.AddMvcCore().AddApiExplorer();
}

這樣就相當(dāng)簡(jiǎn)潔了畜份,哈哈

控制器

修改控制器代碼如下

    private IInfluxDbService _influxDbService;
    public CurrentStatusController(IInfluxDbService influxDbService)
    {
        _influxDbService = influxDbService;
    }

這樣就控制器就可以使用_influxDbService來(lái)操作數(shù)據(jù)庫(kù)了

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市欣尼,隨后出現(xiàn)的幾起案子爆雹,更是在濱河造成了極大的恐慌,老刑警劉巖愕鼓,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钙态,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡菇晃,警方通過(guò)查閱死者的電腦和手機(jī)册倒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)磺送,“玉大人驻子,你說(shuō)我怎么就攤上這事」啦樱” “怎么了崇呵?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)馅袁。 經(jīng)常有香客問(wèn)我域慷,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任犹褒,我火速辦了婚禮抵窒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘叠骑。我一直安慰自己李皇,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開(kāi)白布座云。 她就那樣靜靜地躺著疙赠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪朦拖。 梳的紋絲不亂的頭發(fā)上圃阳,一...
    開(kāi)封第一講書(shū)人閱讀 51,287評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音璧帝,去河邊找鬼捍岳。 笑死,一個(gè)胖子當(dāng)著我的面吹牛睬隶,可吹牛的內(nèi)容都是我干的锣夹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼苏潜,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼银萍!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起恤左,我...
    開(kāi)封第一講書(shū)人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤贴唇,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后飞袋,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體戳气,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年巧鸭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瓶您。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡纲仍,死狀恐怖呀袱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情郑叠,我是刑警寧澤夜赵,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站锻拘,受9級(jí)特大地震影響油吭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜署拟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一婉宰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧推穷,春花似錦心包、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至区宇,卻和暖如春娃殖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背议谷。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工炉爆, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人卧晓。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓芬首,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親逼裆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子郁稍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容