【发布时间】: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