gpt4 book ai didi

c# - 我们如何才能在 ASP.NET Core 中为我们的应用程序提供类似中间件的架构?

转载 作者:行者123 更新时间:2023-11-30 13:14:36 24 4
gpt4 key购买 nike

我想知道如何在我的应用程序中使用像 asp.net core 这样的中间件架构?

这个目标需要哪种模式?

像这样设计添加新功能和......是否有任何引用?

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();

if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
app.UseBrowserLink();
}
else
{
app.UseExceptionHandler("/Home/Error");
}

app.UseStaticFiles();

app.UseIdentity();

// Add external authentication middleware below. To configure them please see http://go.microsoft.com/fwlink/?LinkID=532715

app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}

通过非常简单的 Configure 方法,我们可以向应用程序添加新功能 他们是如何实现这样的功能的?

最佳答案

我为我正在从事的项目制作了一个简单的原型(prototype)实现,它与 ASP.NET Core 无关,因此不了解其架构或实现的人可能更容易理解这个概念。

此处发挥作用的设计模式称为责任链模式

所以我们首先需要为应用程序定义委托(delegate):

public delegate void InputDelegate(char key);

然后我们需要一些东西来使用它,所以这是一个非常简单的事件/主循环实现:

internal class TerminalHost
{
private InputDelegate _inputDelegate;

public TerminalHost()
{
// Initializes the first delegate to be invoked in the chain.
_inputDelegate = Console.Write;
}

internal void Start()
{
CancellationTokenSource tokenSource = new CancellationTokenSource();

while (!tokenSource.IsCancellationRequested) {
ConsoleKeyInfo keyInfo = Console.ReadKey();

_inputDelegate(keyInfo.KeyChar);
}
}

/// <summary>
/// Adds the middleware to the invocation chain.
/// </summary>
/// <param name="middleware"> The middleware to be invoked. </param>
/// <remarks>
/// The middleware function takes an instance of delegate that was previously invoked as an input and returns the currently invoked delegate instance as an output.
/// </remarks>
internal void Use(Func<InputDelegate, InputDelegate> middleware)
{
// Keeps a reference to the currently invoked delegate instance.
_inputDelegate = middleware(_inputDelegate);
}
}

最后,我们需要创建一个 TerminalHost 类的实例并调用 Use 方法,所以这将是这样的:

class Program
{
static void Main(string[] args)
{
TerminalHost terminal = new TerminalHost();

terminal.Use(next => ch => {
Console.WriteLine(ch);

next(ch);
});

terminal.Start();
}
}

我希望它有意义并且对外面的人有帮助! :)

关于c# - 我们如何才能在 ASP.NET Core 中为我们的应用程序提供类似中间件的架构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38988257/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com