1

我在我的控制器中设置 DI,如下所示,并绑定到注册 IHubContext,如它所见

控制器:

public class DemoController : Controller
{
    private IHubContext<DemoHub> context;

    public DemoController(IHubContext<DemoHub> context)
    {
        this.context = context;
    }
}


全球.asax:

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
    var container = new Container();
    container.Options.DefaultScopedLifestyle = new WebRequestLifestyle();



    container.Register<IHubContext, IHubContext>(Lifestyle.Scoped);

    // or 

    container.Register<IHubContext>(Lifestyle.Scoped);

    // code omitted
}

但是当我调试我的应用程序时,遇到“ System.ArgumentException:'给定类型 IHubContext 不是具体类型。请使用其他重载之一来注册此类型。参数名称:TImplementation' ”错误。那么,如何正确注册 IHubContext 呢?

4

1 回答 1

3

由于ASP.NET MVC没有为SignalR集线器上下文内置依赖注入,因此您必须使用GlobalHost.ConnectionManager. 有了这个,您可以使用创建IHubContext实例的容器注册依赖项。考虑到您输入了集线器

public class DemoHub : Hub<ITypedClient>
{
}

和界面

public interface ITypedClient
{
    void Test();
}

注册依赖如下

container.Register<IHubContext<ITypedClient>>(() =>
{
    return GlobalHost.ConnectionManager.GetHubContext<DemoHub, ITypedClient>();
}, Lifestyle.Scoped);

控制器应该看起来像

public class DemoController : Controller
{
    private IHubContext<ITypedClient> context;

    public DemoController(IHubContext<ITypedClient> context)
    {
        this.context = context;
    }
}
于 2019-07-29T23:46:27.353 回答