【问题标题】:Using StructureMap for dependency injection to SignalR 2.0.1使用 StructureMap 对 SignalR 2.0.1 进行依赖注入
【发布时间】:2014-01-17 04:37:31
【问题描述】:

我正在尝试使用 StructureMap 将依赖项注入到 SignalR 集线器。

互联网上的许多消息来源说这应该按照以下答案进行:How do you Resolve signalR v2.0 with StructureMap v2.6。我试过了,让它工作了——至少在第一个页面加载后的第一个操作中。

当我尝试离开包含 SignalR-JS-Code 的 HTML 页面(或重新加载页面)时,或者当我第二次使用集线器中定义的功能之一时,我得到了这个 StructureMapException:You cannot use the HttpContextLifecycle outside of a web request. Try the HybridLifecycle instead.在我的HubActivatorpublic IHub Create(HubDescriptor descriptor) 函数中

我已经通过在引导期间修改我的扫描来尝试过:

container.Configure(x =>
{
    x.Scan(scan =>
    {
        scan.TheCallingAssembly();
        scan.AssembliesFromApplicationBaseDirectory(GetFilteredAssemblies);
        scan.WithDefaultConventions().OnAddedPluginTypes(t => t.LifecycleIs(InstanceScope.Hybrid));
        scan.LookForRegistries();
        scan.AddAllTypesOf<MyProject.Data.Common.IEntity>();
        scan.AddAllTypesOf<IMappedEntity>();
        scan.AddAllTypesOf<IDatabaseInitializer>();
        scan.AddAllTypesOf<IBootstrapMember>();
        scan.AddAllTypesOf<IMembership>();
    });
});

但这并没有帮助。

我必须更改什么(在 SignalR 或 StructureMap 中)才能修复此异常?

【问题讨论】:

    标签: dependency-injection inversion-of-control signalr structuremap lifecycle


    【解决方案1】:

    结果我不得不从

    更改我的 NHibernateRegistry
    [...]
    if (HttpContext.Current != null)
    {
        For<ISession>()
        .HttpContextScoped()
        .Use(x => x.GetInstance<ISessionFactory>().OpenSession());
    }
    [...]
    

    [...]
    if (HttpContext.Current != null)
    {
        For<ISession>()
        .HybridHttpOrThreadLocalScoped()
        .Use(x => x.GetInstance<ISessionFactory>().OpenSession());
    }
    [...]
    

    不同的上下文似乎可以避免会话丢失。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-26
      相关资源
      最近更新 更多