我正在尝试将SignalR IHubContext
注入ASP.NET MVC 5应用框架4.72 (而不是.NET Core)中的WebAPI2.x控制器中。它在调用Web控制器MyController
时抛出此异常
在试图创建类型为“MyController”的控制器时发生了错误。确保控制器具有无参数的公共构造函数。
内部例外说:
'Autofac.Core.Activators.Reflection.DefaultConstructorFinder‘在“MyController”类型上找到的任何构造函数都不能使用可用的服务和参数:无法解析参数'Microsoft.AspNet.SignalR.IHubContext[MyHub] context' of constructor 'Void .ctor(Microsoft.AspNet.SignalR.IHubContext
MyHub)调用。
我不介意使用属性注入()来完成这一任务,但是没有任何运气能让它正常工作。所以我要在控制器的控制器上注射。
我跟随这些答案寻求帮助:
下面是Web控制器:
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);
});
}
我遗漏了什么?谢谢。
发布于 2020-05-18 09:32:55
您的第一个问题是typeof(IHubContext)
与typeof(IHubContext<MyHub>)
不一样。您可以使用以下方法来避免这种情况:
pi.ParameterType == typeof(IHubContext).MakeGenericType(typeof(MyHub))
但是,旧版本的SignalR并不很好地支持泛型接口,所以如果您将比较保留为原样,并在MyController
中注入一个IHubContext
而不是一个IHubContext<MyHub>
,它可能会更好。
https://stackoverflow.com/questions/61828792
复制