我正在实现电子邮件发送模块,需要构建URL。我的目的是使用IUrlHelper,但是由于它需要提供大量的依赖关系,所以我真的很难构建这个对象。
此时此刻,我正处于这一步:
ActionContext actionCtx = new ActionContext(new DefaultHttpContext(), new RouteData(), new ActionDescriptor());
_urlHelper = new UrlHelper(actionCtx);但是,通过这种方式构建的urlHelper在尝试构建URL时仍然会失败,只有一个例外。
例外是:
指数超出了范围。必须是非负的,并且小于集合的大小。参数名称: System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument参数处的索引,System.Collections.Generic.List`1.get_Item(Int32索引处的ExceptionResource资源)在Microsoft.AspNetCore.Mvc.Routing.UrlHelper.get_Router()处
所以现在它可能需要创建和设置IRouter实例,但正如我所看到的,它再次需要设置大量的deps
那么,应该如何正确地做到这一点呢?
发布于 2018-02-01 13:47:28
正如您所看到的,在一个完全断开的库中实现这一点几乎是不可能的。更重要的是,您甚至需要路由来实现它的价值,这些路径将被清晰地限制在单独的web应用程序中,您的库必须有很强的依赖性才能访问。如果不是显而易见的话,那将是一个非常糟糕的设计选择。
我觉得你应该后退一步重新评估一下。如果您的目标是通过外部进程发送电子邮件,那么无论在那里安排任务(想必是您的web应用程序),都应该传递该邮件所需的信息,包括任何URL。这就把创建这些URL的责任从你的电子邮件库(它真的不应该承担这个责任--做一件事并做好)转移到一个可能已经具备必要能力的源上。
如果因为某种原因不能这样做的话。我想说的是,您的下一个最佳选择是在您要为之生成URL的web应用程序上设置一个或多个端点,并将这些URL返回您需要的URL和/或电子邮件库发送电子邮件所需的任何其他附加信息。这仍然外化了电子邮件发送功能,但为您的库提供了一种干净的方式,以便在需要时从web应用程序访问信息。
https://stackoverflow.com/questions/48562477
复制相似问题