如何在 ASP.NET Core 中为同一接口配置不同的实现
前言
通常,我們使用依賴(lài)注入時(shí),一個(gè)接口僅對(duì)應(yīng)一種實(shí)現(xiàn),使用時(shí)可以直接得到實(shí)現(xiàn)類(lèi)的實(shí)例,類(lèi)似這樣:
services.AddScoped<IServiceA,ServiceA>();public?WeatherForecastController(IServiceA?service)?{?}但是,有時(shí)可能需要在同一ASP.NET Core 應(yīng)用程序中使用同一接口的不同實(shí)現(xiàn)。
下面是不同需求下對(duì)應(yīng)的解決方案。
為不同的類(lèi)型使用不同實(shí)現(xiàn)
例如倉(cāng)儲(chǔ)接口IRepository<>,默認(rèn)使用EF core訪(fǎng)問(wèn)關(guān)系型數(shù)據(jù)庫(kù),而對(duì)于特定實(shí)體(例如訂單Order)使用MONGODB存儲(chǔ)。
可以首先注冊(cè)默認(rèn)實(shí)現(xiàn),再針對(duì)特定實(shí)體注冊(cè)指定實(shí)現(xiàn):
services.AddScoped(typeof(IRepository<>),?typeof(EFCoreRepository<>)); services.AddScoped(typeof(IRepository<Order>),?typeof(MongoRepository<Order>));在不同的Controller中使用不同實(shí)現(xiàn)
例如訂單倉(cāng)儲(chǔ)接口IRepository,默認(rèn)使用MONGODB存儲(chǔ),而在報(bào)表服務(wù)ReportController中訪(fǎng)問(wèn)ES。
可以針對(duì)構(gòu)造函數(shù)注冊(cè)指定參數(shù):
services.AddScoped<ESRepository<Order>>(); services.AddScoped(x?=>?new?ReportController(x.GetRequiredService<ESRepository<Order>>()));注意:以上方式需要使用命令將Controller添加為服務(wù)才能使用:
services.AddControllers().AddControllersAsServices();結(jié)論
關(guān)于如何注入同一接口的不同實(shí)現(xiàn),你有什么不同需求或者實(shí)現(xiàn)方案,歡迎在公眾號(hào)首頁(yè)留言交流!
總結(jié)
以上是生活随笔為你收集整理的如何在 ASP.NET Core 中为同一接口配置不同的实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Visual Studio怎么使用中文帮
- 下一篇: .NET6之MiniAPI(二十三):R