加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 在MVC 5应用程序中使用autofac in为SignalR Hub

发布时间:2020-12-16 07:01:12 所属栏目:asp.Net 来源:网络整理
导读:我正在尝试将SignalR 2引入现有项目,其中使用autofac执行所有依赖项注入,并且所有依赖项配置都在Global.asax中执行.我找到了使用带有autofac的SignalR及其 accompanying documentation的Autofac.SignalR软件包. 我按照提供的文档中的示例进行操作,并遵循使用
我正在尝试将SignalR 2引入现有项目,其中使用autofac执行所有依赖项注入,并且所有依赖项配置都在Global.asax中执行.我找到了使用带有autofac的SignalR及其 accompanying documentation的Autofac.SignalR软件包.

我按照提供的文档中的示例进行操作,并遵循使用RegisterHubs函数的建议,而不是定义我的各个集线器依赖项.

不幸的是,当我尝试从lifetimeScope解析依赖项时,我的Hub类会出现以下运行时错误

Autofac.Core.DependencyResolutionException was unhandled by user code
HResult=-2146233088
Message=No scope with a Tag matching 'AutofacWebRequest' is
visible from the scope in which instance was requested.
This generally indicates that a component registered as per-HTTP
request is being requested by a SingleInstance() component
(or a similar scenario.) Under the web integration always request
dependencies from the DependencyResolver.Current or 
ILifetimeScopeProvider.RequestLifetime,never from the container itself.

我无法让DependencyResolver.Current或ILifeTimeScopeProvider为我工作.

我的依赖配置如下

var builder = new ContainerBuilder();
    .RegisterControllers(typeof (MvcApplication).Assembly);
    .RegisterHubs(Assembly.GetExecutingAssembly());
    ...
var container = builder.Build();

// Set dependency resolver for MVC
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

// Set dependency resolver for Web API
GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container);

// Set the dependency resolver for SignalR
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

var signalRDependencyResolver = new Autofac.Integration.SignalR.AutofacDependencyResolver(container);
GlobalHost.DependencyResolver = signalRDependencyResolver;

我还根据示例设置了我的集线器类:

public class BaseHub : Hub
{
    protected readonly ILifetimeScope _hubLifetimeScope;
    private static IUserSignalRConnectionRepository _userSignalRConnectionRepository;

    public BaseHub(ILifetimeScope lifetimeScope) : base()
    {
        _hubLifetimeScope = lifetimeScope.BeginLifetimeScope();

        _userSignalRConnectionRepository = _hubLifetimeScope.Resolve<IUserSignalRConnectionRepository>();
    }

    protected override void Dispose(bool disposing)
    {
        // Dipose the hub lifetime scope when the hub is disposed.
        if (disposing && _hubLifetimeScope != null)
            _hubLifetimeScope.Dispose();

        base.Dispose(disposing);
    }
}

例外情况发生在该行的cub类中

_userSignalRConnectionRepository = _hubLifetimeScope.Resolve<IUserSignalRConnectionRepository>();

解决方法

您应该包含注册IUserSignalRConnectionRepository的代码.

错误消息似乎表明此依赖项是使用InstancePerHttpRequest()注册的,相当于InstancePerMatchingLifetimeScope(“AutofacWebRequest”).在MVC请求的情况下,此范围是自动创建的,但不是针对SignalR请求(这可能是一件好事,因为它们可以无限期地持续).

您可以通过调用lifetimeScope.BeginLifetimeScope(“AutofacWebRequest”);来解决此问题.而不是lifetimeScope.BeginLifetimeScope();在你的Hub构造函数中.

或者,您可以使用InstancePerDependency()(默认值)或SingleInstance()而不是InstancePerHttpRequest()来注册IUserSignalRConnectionRepository.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读