【问题标题】:Why does LinkGenerator always return null?为什么 LinkGenerator 总是返回 null?
【发布时间】:2021-01-10 12:25:25
【问题描述】:

我编写了一个类来为其他类(Aspnet 核心 3.1)生成链接,这些类发送带有链接的电子邮件,这些链接通过 DI 获取 LinkGenerator 的实例。

每当我在 LinkGenerator 的实例上调用任何方法时,它都会返回 null。我做错了吗?

 public interface IPageLinkGenerator
    {
        string LinkFor(string page, object values);
    }

    public class PageLinkGenerator : IPageLinkGenerator
    {
        private readonly IHttpContextAccessor _accessor;
        private readonly LinkGenerator _generator;

        public PageLinkGenerator(IHttpContextAccessor accessor, LinkGenerator generator)
        {
            _accessor = accessor;
            _generator = generator;
        }

        public string LinkFor(string page, object values)
        {
            var context = _accessor.HttpContext;

            var callBackLink = _generator.GetUriByPage(
                context,
                page: page,
                handler: null,
                values: values,
                scheme: context.Request.Scheme,
                host: context.Request.Host
                );

            return callBackLink;
        }
    }

这是我在 Startup.cs 中的 ConfigureServices 方法

public void ConfigureContainer(ServiceRegistry services)
        {
            services.Scan(_ =>
            {
                _.AssemblyContainingType<IDbConnectionFactory>();
                _.WithDefaultConventions();
                _.ConnectImplementationsToTypesClosing(typeof(IHandle<>));
            });

            services.For<IConfiguration>().Use(Configuration);
            services.For<IStorageClient>().Use<AzureBlobClient>();
            services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
            services.AddSingleton<IDomainEventDispatcher, DomainEventDispatcher>();
            services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
            services.AddScoped(typeof(IAsyncRepository<>), typeof(EfRepository<>));
            services.AddScoped(typeof(IValidationRepository<>), typeof(ValidationRepository<>));
            
            services.AddCustomisedDbContext(Configuration);
            services.AddHtmlTags(new TagConventions());
            services.AddMediatR(typeof(Startup));

            services.For<IRazorLightEngine>()
                .Use(RazorLightEngineFactory.Get())
                .Singleton();

            services.AddTestConfigurationInstance(_environment, Configuration);
            services.AddEmailSender(_environment);

            services.AddProxyHttpClient();

            services.AddCustomisedIdentity(_environment, Configuration);

            services.AddAuthorizationPolicies(Configuration);

            services.AddCustomisedRazorPages();

            services.AddWkhtmltopdf();

            services.AddLocalization();
            
            services.AddRouting();
        }

这是调用类的方法:

public async Task Handle(BookingAdminMessageCreated @event, CancellationToken cancellationToken)
    {
        var url = _linkGenerator.LinkFor("/Customers/Bookings/Messages", new { Id = @event.BookingId.ToString() });
        
        foreach (var (fullName, emailAddress) in @event.EmailDetails)
        {
            await _emailSender.SendAsync(emailAddress, MailType.MessageAdded, new Dictionary<string, dynamic>
            {
                {"FullName", fullName},
                {"ReferenceNumber", @event.Reference},
                {"BookingUrl", HtmlEncoder.Default.Encode(url)},
            });
        }
    }

【问题讨论】:

  • 您能告诉我您如何称呼 PageLinkGenerator 吗?您是否将其注册为服务?
  • 我正在使用 Lamar 将其注册为服务并通过 DI 将其注入另一个类。
  • LinkGenerator 服务将在您调用 services.AddRouting(); 时注册,因为我不知道 lamar 是否会注册 addrouting 服务。您可以尝试注册并重试。此外,请像 @CodeCaster 所说的那样分享您的代码,例如 startup.cs。
  • @BrandoZhang 我已经将 services.AddRouting() 添加到 startup.cs 并且 LinkGenerator 仍然返回 null
  • 看来您没有在ConfigureContainer方法中将PageLinkGenerator注册为服务。

标签: asp.net-mvc asp.net-core razor-pages


【解决方案1】:

问题是我错过了页面中的页面名称。我没有指定索引页面。

_linkGenerator.LinkFor("/Customers/Bookings/Messages/Index" ...

【讨论】:

    猜你喜欢
    • 2019-06-15
    • 1970-01-01
    • 2014-09-12
    • 2019-09-18
    • 2014-09-02
    • 2015-02-27
    • 1970-01-01
    • 2011-04-16
    • 1970-01-01
    相关资源
    最近更新 更多