如何在 Umbraco 7 控制器和 AutoFac 中通过依赖注入使用 IMediator (MediatR)?

问题描述 投票:0回答:1

我已经在控制器中设置了依赖注入 Autofac 基于这个例子,为我的 umbracp 7.15.3 应用提供了一个新的解决方案。https:/gosudev.comlogsoftware-developmentumbraco-cmsumbraco-web-api-and-mvc-dependency-injection-with-autofac。

这个例子和这里的示例控制器一样,效果很好。https:/github.comgosudevUmbracoCMSDIMixedModeblobmastersrcUmbracoCMSDIMixedModeUmbracoCMSDIMixedMode.WebControllersApiSampleWebApiController.cs。

我需要使用其他服务,并试图使用 IMediator (MediatR)所以我把上面的控制器修改为。

public class SampleWebApiController : UmbracoApiController
{
    private readonly IMediator _mediator;
    private readonly ISampleService _sampleService;

    public SampleWebApiController(ISampleService sampleService, IMediator mediator)
    {
        _sampleService = sampleService;
    }

    //http://localhost:60580/umbraco/api/SampleWebApi/Get
    [System.Web.Http.HttpGet]
    public JsonResult Get()
    {
        return new JsonResult() { Data = new { items = _sampleService.GetItems() }, JsonRequestBehavior = JsonRequestBehavior.AllowGet };
    }
}

WebModule (https:/github.comgosudevUmbracoCMSDIMixedModelrcUmbracoCMSDIMixedModeUmbracoCMSDIMixedMode.WebWebModule.cs。)到。

    protected override void Load(ContainerBuilder builder)
    {
        builder.RegisterType<SampleService>().As<ISampleService>();
        builder.RegisterType<Mediator>().As<IMediator>();

        builder.Register(c => UmbracoContext.Current).AsSelf();
    }

这时控制器停止工作,我得到一个错误信息。

{
  "Message": "An error has occurred.",
  "ExceptionMessage": "An error occurred when trying to create a controller of type 'SampleWebApiController'. Make sure that the controller has a parameterless public constructor.",
  "ExceptionType": "System.InvalidOperationException",
  "StackTrace": "   at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)\r\n   at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request)\r\n   at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__15.MoveNext()",
  "InnerException": {
    "Message": "An error has occurred.",
    "ExceptionMessage": "An exception was thrown while activating MyDomain.Controllers.SampleWebApiController -> MediatR.Mediator.",
    "ExceptionType": "Autofac.Core.DependencyResolutionException",
    "StackTrace": "   at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 parameters, Object& decoratorTarget)\r\n   at Autofac.Core.Resolving.InstanceLookup.Execute()\r\n   at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, ResolveRequest request)\r\n   at Autofac.Core.Resolving.ResolveOperation.Execute(ResolveRequest request)\r\n   at Autofac.Core.Lifetime.LifetimeScope.ResolveComponent(ResolveRequest request)\r\n   at Autofac.ResolutionExtensions.TryResolveService(IComponentContext context, Service service, IEnumerable`1 parameters, Object& instance)\r\n   at Autofac.ResolutionExtensions.ResolveOptionalService(IComponentContext context, Service service, IEnumerable`1 parameters)\r\n   at Autofac.Integration.WebApi.AutofacWebApiDependencyScope.GetService(Type serviceType) in C:\\projects\\autofac-webapi\\src\\Autofac.Integration.WebApi\\AutofacWebApiDependencyScope.cs:line 76\r\n   at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator)\r\n   at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)",
    "InnerException": {
      "Message": "An error has occurred.",
      "ExceptionMessage": "None of the constructors found with 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' on type 'MediatR.Mediator' can be invoked with the available services and parameters:\r\nCannot resolve parameter 'Microsoft.Practices.ServiceLocation.ServiceLocatorProvider serviceLocatorProvider' of constructor 'Void .ctor(Microsoft.Practices.ServiceLocation.ServiceLocatorProvider)'.",
      "ExceptionType": "Autofac.Core.DependencyResolutionException",
      "StackTrace": "   at Autofac.Core.Activators.Reflection.ReflectionActivator.GetValidConstructorBindings(ConstructorInfo[] availableConstructors, IComponentContext context, IEnumerable`1 parameters)\r\n   at Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext context, IEnumerable`1 parameters)\r\n   at Autofac.Core.Resolving.InstanceLookup.Activate(IEnumerable`1 parameters, Object& decoratorTarget)"
    }
  }
}

为什么它是错误的,如何将另一个服务注入到这个控制器和其他控制器中?

dependency-injection autofac umbraco7 mediatr
1个回答
0
投票

我已经安装了 MediatR.Extensions.Autofac.DependencyInjection 并将这一行改为。

builder.RegisterType<Mediator>().As<IMediator>();

改为

builder.AddMediatR(this.GetType().Assembly);

所以配置是。

protected override void Load(ContainerBuilder builder)
{
    builder.RegisterType<SampleService>().As<ISampleService>();
    builder.AddMediatR(this.GetType().Assembly); //builder.RegisterType<Mediator>().As<IMediator>();

    builder.Register(c => UmbracoContext.Current).AsSelf();
}
© www.soinside.com 2019 - 2024. All rights reserved.