如果没有HttpContext或ActionContext,如何在.net核心中构建URL

时间:2018-02-01 12:10:54

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

我正在实施电子邮件发送模块,需要构建网址。我的目的是使用IUrlHelper,但由于需要提供大量的依赖关系,我真的很难构建这个对象。

目前我正迈出这一步:

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

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

例外是:

  

指数超出范围。必须是非负数且小于   集合。参数名称:index   在   System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument   参数,ExceptionResource资源)at   System.Collections.Generic.List`1.get_Item(Int32 index)at   Microsoft.AspNetCore.Mvc.Routing.UrlHelper.get_Router()

现在可能需要创建和设置IRouter个实例,但正如我所看到的那样,再次需要设置大量的代数

那么应该如何正确地做到这一点?

1 个答案:

答案 0 :(得分:2)

正如您所看到的那样,在一个完全断开连接的库中,实现这一目标几乎是不可能的。更重要的是,你需要 routes 来使它变得有价值,它们将被完全限制在一个单独的Web应用程序中,你的库必须具有对访问的硬依赖性。如果它不明显,那将是一个非常糟糕的设计选择。

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

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