[译]ASP.NET Core 2.0 带初始参数的中间件
問(wèn)題
如何在ASP.NET Core 2.0向中間件傳入初始參數(shù)?
答案
在一個(gè)空項(xiàng)目中,創(chuàng)建一個(gè)POCO(Plain?Old?CLR?Object)來(lái)保存中間件所需的參數(shù):
public class GreetingOptions { ? ?? public string GreetAt { get; set; } ?
??public string GreetTo { get; set; } }
添加一個(gè)中間件:
??private readonly RequestDelegate _next; ?
??private readonly GreetingOptions _options; ?
?public GreetingMiddleware(RequestDelegate next, GreetingOptions options){_next = next;_options = options;} ?
?public async Task Invoke(HttpContext context){ ? ? ?
? ? ? var message = $"Good {_options.GreetAt} {_options.GreetTo}"; ? ?
? ? ??await context.Response.WriteAsync(message);} }
答案1:實(shí)例類型
添加一個(gè)擴(kuò)展方法來(lái)配置中間件:
public static IApplicationBuilder UseGreetingMiddleware(this IApplicationBuilder app, GreetingOptions options) { ? ?return app.UseMiddleware<GreetingMiddleware>(options); }使用中間件:
public void Configure(IApplicationBuilder app, IHostingEnvironment env) {app.UseGreetingMiddleware(new GreetingOptions {GreetAt = "Morning",GreetTo = "Tahir"}); }答案2:函數(shù)類型
添加一個(gè)擴(kuò)展方法來(lái)配置中間件:
?var options = new GreetingOptions();optionsAction(options); ?
?return app.UseMiddleware<GreetingMiddleware>(options); }
使用中間件:
上述兩種方法結(jié)果一致。
運(yùn)行,此時(shí)頁(yè)面顯示:
討論
之前我們?cè)懻撨^(guò),在單獨(dú)的類中定義中間件并使用擴(kuò)展方法將其添加到請(qǐng)求管道中是最佳實(shí)踐。我們也可能需要向中間件傳入?yún)?shù),通過(guò)對(duì)ASP.NET Core源代碼以及其他在線示例的學(xué)習(xí),我總結(jié)出來(lái)上面兩種模式。
上述的兩種解決方法都非常直觀。我們將參數(shù)封裝到一個(gè)POCO類中,然后創(chuàng)建一個(gè)擴(kuò)展方法來(lái)接受下面的參數(shù):
1.?POCO實(shí)例
2.?需要調(diào)用的函數(shù)(在函數(shù)內(nèi)設(shè)置POCO)
注:POCO實(shí)例通過(guò)構(gòu)造函數(shù)傳入中間件。UseMiddleware()方法接收可變參數(shù)params object[],并將這些參數(shù)傳入中間件構(gòu)造函數(shù)。
配置服務(wù)
這些模式也能用于向服務(wù)容器中添加服務(wù)實(shí)例。為了便于說(shuō)明,我們先添加一個(gè)服務(wù):
public interface IMessageService { ??string FormatMessage(string message); }
public class MessageService : IMessageService { ?
?private readonly GreetingOptions _options;
? ?public MessageService(GreetingOptions options){_options = options;} ? ?
public string FormatMessage(string message){ ? ? ? ?return $"Good {_options.GreetAt} {_options.GreetTo} - {message}";} }
添加如下任一個(gè)擴(kuò)展方法來(lái)配置服務(wù):
在Configure()中使用此服務(wù):
因?yàn)镃onfigureServices()先于Configure()執(zhí)行,因此我們可以直接在Configure()注入此服務(wù):
運(yùn)行,此時(shí)頁(yè)面顯示:
?
?
源代碼下載
?
原文:https://tahirnaushad.com/2017/08/29/passing-parameters-to-middleware-in-asp-net-core-2-0/
.NET社區(qū)新聞,深度好文,微信中搜索dotNET跨平臺(tái)或掃描二維碼關(guān)注
總結(jié)
以上是生活随笔為你收集整理的[译]ASP.NET Core 2.0 带初始参数的中间件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ABP从入门到精通(1):aspnet-
- 下一篇: .NET下使用HTTP请求的正确姿势