c# - 如果没有 HttpContext 或 ActionContext,如何在 .net core 中构建 URL

标签 c# asp.net-core .net-core asp.net-core-mvc

我正在实现电子邮件发送模块并且需要构建 URL。我的意图是使用 IUrlHelper,但由于它需要提供大量依赖项,我真的很难构建这个对象。

目前我在这一步:

ActionContext actionCtx = new ActionContext(new DefaultHttpContext(), new RouteData(), new ActionDescriptor());
_urlHelper = new UrlHelper(actionCtx);

但以这种方式构造 urlHelper 在尝试构建 URL 时仍然失败并出现异常。

异常(exception)是:

Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index at System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource) at System.Collections.Generic.List`1.get_Item(Int32 index) at Microsoft.AspNetCore.Mvc.Routing.UrlHelper.get_Router()

所以现在可能需要创建和设置 IRouter 实例,但正如我所见,它再次需要设置大量的 deps

那么应该如何正确完成呢?

最佳答案

如您所见,在完全断开连接的图书馆中实现这一点几乎是不可能的。更重要的是,您需要 路由 甚至让它变得有值(value),它们将被干净地限制在一个单独的 Web 应用程序中,您的库必须对访问具有硬依赖性。如果它不明显,那将是一个非常糟糕的设计选择。

我认为您需要退后一步重新评估。如果您的目标只是通过外部进程发送电子邮件,那么无论在那里安排任务(大概是您的 Web 应用程序)都应该向它传递该电子邮件所需的信息,包括任何 URL。这将创建这些 URL 的责任从您的电子邮件库(它实际上不应该承担这个责任——做一件事并做好)转移回一个可能已经具备必要能力的来源。

如果由于某种原因无法做到这一点。我会说您的下一个最佳选择是在您尝试为其生成 URL 的 Web 应用程序上设置一个或多个端点,并让这些端点返回您需要的 URL 和/或电子邮件库需要发送的任何其他附加信息电子邮件。这仍然外部化了电子邮件发送功能,但为您的图书馆提供了一种干净的方式,可以在需要时从 Web 应用程序访问信息。

关于c# - 如果没有 HttpContext 或 ActionContext,如何在 .net core 中构建 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48562477/

相关文章:

api - 在ASP Net Core API中使用NLog进行Elasticsearch日志记录失败

c# - MVC 中的动态模型(非类)元数据提供程序

c# - 具有泛型返回类型的可空引用类型

c# - 在 ASP.NET Core 2 日志记录更新后将 ILogger 映射到 Serilog 的记录器

c# - 在没有 DI 的控制台应用程序中将 IConfigurationSection 与可刷新配置绑定(bind)

c# - 如何从针对完整 .NET Framework 的 .NET SDK csproj 中删除默认/锁定的程序集引用?

dotnet-cli - Ubuntu dotnet 用户 secret

c# - 从 .Net 解决方案资源管理器拖放时如何以编程方式获取文件名?

c# - 即使元素确实存在,LINQ to XML Elements() 和 Descendants() 也没有产生任何结果

angular - ASP.NET 核心 Angular SPA 模板将自定义 Bootstrap 主题添加到 webpack.config.js