我试图在我的WebApi启动文件中使用container.Resolve(),这样当我的HATEOAS链接助手调用其条件中的函数将链接传递给UI时,我就可以解析Mediator。
现在我将模型传递回UI,但链接取决于设置。如果该设置为“假”,那么我不希望将该链接发送回用户界面,因此用户界面不会为该用户呈现该按钮。
所以我的HATEOAS linkhelper函数如下所示:
public static class (ControllerName)LinkHelper
{
public static Action<LinksOptions> AddLinksPolicies(IMediator mediator)
{
return config =>
{
config.AddPolicy<Response<CustomModel>>(
policy => {
policy.RequiredRoutedLink("self-link", RouteNames.NameOfRoute, x => x new { id = x.id },
condition => condition.assert( x => IsSettingEnabled(mediator).Result ));
....
这样我就可以在条件中使用函数,这样我就不会将属性添加到仅用于一个实例的模型中。此函数将像我的RequestHandlers一样,使用MediatR调用存储库进行设置,并提取此设置值。
private async static Task<bool> IsSettingEnabled(IMediator mediator)
{
var settings = await mediator.Send(new GetSettingsRequest());
return settings.Content.SettingEnabled;
}
所以在我的startup.cs中,我已将此添加到AddLinksPolicies()
var mediator = container.ResolveOptional<IMediator>();
...
services.AddLinks(ControllerNameLinkHelper.AddLinksPolicies(mediator));
当我尝试运行此操作时,出现以下错误:
Autofac.Core.Registration.ComponentNotRegisteredException:&#39; The 要求的服务&#39; MediatR.IMediator&#39;尚未注册。至 避免这种异常,要么注册一个组件来提供 服务,使用IsRegistered()检查服务注册,或使用 用于解析可选依赖项的ResolveOptional()方法。&#39;
但由于我的(ControllerName)LinkHelper类是静态的,我不能通过控制器传递IMediator。 如何在startup.cs中注册或设置IMediator,以便可以在我的LinkHelper中使用HATEOAS条件函数?
我已尝试注册Mediator,但我仍然收到NullReferenceException。
当我尝试在startup.cs ConfigureServices()中注册IMediator时:
builder.RegisterType<Mediator>().As<IMediator>().InstancePerLifetimeScope();
但是当我进行API调用时,我的条件会出现以下错误.Assert()行:
NullReferenceException:未将对象引用设置为的实例 对象