将SignalR IHubContext注入到控制器中的Autofac。

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

我想注入一个SignalR IHubContext 到 ASP.NET MVC 5 应用程序 Framework 4.72(不是 .NET Core)中的 Web API 2.x 控制器中。当调用Web API控制器时,它正在抛出这个异常。MyController:

在尝试创建类型为'MyController'的控制器时发生错误。请确保控制器有一个无参数的公共构造函数。

内部异常说。

在类型'MyController'上用'Autofac.Core.Activators.Reflection.DefaultConstructorFinder'找到的构造函数都不能用可用的服务和参数来调用。无法解析参数'Microsoft.AspNet.SignalR.IHubContext'。[MyHub] context' of constructor 'Void .ctor(Microsoft.AspNet.SignalR.IHubContext MyHub])'。

我不介意使用属性注入来做这件事,但没有任何运气让它工作。所以我正在做注入到控制器的c'tor中。

我按照这些答案寻求帮助。

这是Web API控制器。

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);
    });
}

我缺什么?谢谢,我想把SignalR IHubContext注入到ASP.NET MVC 5应用程序的Web API 2.x控制器中。

c# asp.net asp.net-web-api dependency-injection autofac
1个回答
2
投票

你的第一个问题是 typeof(IHubContext) 不等于 typeof(IHubContext<MyHub>). 你可以通过使用。

pi.ParameterType == typeof(IHubContext).MakeGenericType(typeof(MyHub))

然而,旧版本的SignalR并不支持通用接口,所以如果你保持比较的原样,并注入一个通用接口,可能会更好。IHubContext 而非 IHubContext<MyHub>MyController.


-2
投票

你能试着加上这个吗?

app.UseSignalR(routes =>
{
   routes.MapHub<MyHub>("/MyHub");
});
© www.soinside.com 2019 - 2024. All rights reserved.