c# - 使用 Autofac 将 SignalR IHubContext 注入(inject) Controller

标签 c# asp.net asp.net-web-api dependency-injection autofac

我正在尝试注入(inject) SignalR IHubContext进入 ASP.NET MVC 5 应用程序框架 4.72(不是 .NET Core)中的 Web API 2.x Controller 。调用 Web API Controller 时抛出此异常 MyController :

An error occurred when trying to create a controller of type 'MyController'. Make sure that the controller has a parameterless public constructor



内部异常说:

None of the constructors found with 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' on type 'MyController' can be invoked with the available services and parameters: Cannot resolve parameter 'Microsoft.AspNet.SignalR.IHubContext[MyHub] context' of constructor 'Void .ctor(Microsoft.AspNet.SignalR.IHubContext [MyHub])'.



我不介意使用属性注入(inject)来做到这一点,但没有任何运气让它发挥作用。所以我正在注入(inject) Controller 的c'tor。

我已按照以下答案寻求帮助:
  • https://stackoverflow.com/a/37913821/177416 --> c'tor 注入(inject)
  • https://stackoverflow.com/a/29793864/177416 --> c'tor 注入(inject)
  • https://stackoverflow.com/a/26810399/177416 --> 属性注入(inject)
  • https://stackoverflow.com/a/15600493/177416 --> 属性注入(inject)

  • 这是 Web API Controller :
    public class MyController : WebApiController
    {
        public IHubContext<MyHub> Context { get; set; }
    
        public MyController(IHubContext<MyHub> context)
        {
            Context = context;
        }   
    }
    

    这是 Startup.cs 的相关部分:
    public void Configuration(IAppBuilder app)
    {
        // Other code...
    
        var builder = new ContainerBuilder();
        var config = new HttpConfiguration();
    
        builder.RegisterHubs(Assembly.GetExecutingAssembly());
        builder.RegisterControllers(typeof(MvcApplication).Assembly)
            .InstancePerRequest();
        builder.RegisterApiControllers(Assembly.GetExecutingAssembly())
            .InstancePerRequest();
        builder.RegisterType<AutofacDependencyResolver>()
            .As<IDependencyResolver>()
            .SingleInstance();
    
        builder
            .Register(c => c.Resolve<IConnectionManager>().GetHubContext<MyHub>())
            .Named<IHubContext>("MyHub");
        builder.RegisterType<MyController>()
            .WithParameter(
                new ResolvedParameter(
                    (pi, ctx) => pi.ParameterType == typeof(IHubContext),
                    (pi, ctx) => ctx.ResolveNamed<IHubContext>("MyHub")
                )
            );
    
        var container = builder.Build();
        app.UseAutofacMiddleware(container);
    
        DependencyResolver.SetResolver(new Autofac.Integration.Mvc.AutofacDependencyResolver(container));
        config.DependencyResolver = new AutofacWebApiDependencyResolver((IContainer)container);
    
        app.Map("/signalr", map =>
        {
            var hubConfiguration = new HubConfiguration
            {
                Resolver = new AutofacDependencyResolver(container),
            };
    
            map.RunSignalR(hubConfiguration);
        });
    }
    

    我错过了什么?谢谢。

    最佳答案

    你的第一个问题是 typeof(IHubContext)typeof(IHubContext<MyHub>) 不一样.您可以使用以下方法解决此问题:
    pi.ParameterType == typeof(IHubContext).MakeGenericType(typeof(MyHub))
    但是,旧版本的 SignalR 不能很好地支持通用接口(interface),因此如果您保持比较不变并注入(inject) IHubContext 可能会更好。而不是 IHubContext<MyHub>MyController .

    关于c# - 使用 Autofac 将 SignalR IHubContext 注入(inject) Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61828792/

    相关文章:

    c# - 在多个线程上运行 Parallel.Foreach 的性能

    asp.net mvc 数据表

    c# - 如何在进程停止时取消虚拟主机

    jquery - 使用 JSONP 的 Ajax 调用不起作用。未提供回拨

    c# - 将现有的 QWidget 停靠在 QWindow 中

    c# - 如何通过文件上传发布简单的 JSON 数据?

    c# - 最初未绘制扩展的 UIButton 边框

    c# - ASP.NET MVC - 编辑和只读的单一 View ?

    c# - session 在 IHttpModule 中不可用

    c# - 找不到 HttpConfiguration 方法 EnableCors