Autofac在Hateoas linkhelper

时间:2018-06-11 17:20:13

标签: autofac asp.net-core-2.0 hateoas mediatr

我试图在我的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:未将对象引用设置为的实例   对象

0 个答案:

没有答案