首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OWIN + SignalR + Autofac

OWIN + SignalR + Autofac
EN

Stack Overflow用户
提问于 2015-04-21 21:57:45
回答 5查看 5.9K关注 0票数 19

摘自:http://docs.autofac.org/en/latest/integration/signalr.html

“OWIN集成中的一个常见错误是使用GlobalHost。在OWIN中,您可以从头创建配置。在使用OWIN集成时,不应该引用GlobalHost。”

听起来很合理。但是,应该如何从一个IHubContext解析ApiController,比如通常的(非OWIN):

GlobalHost.ConnectionManager.GetHubContext<MyHub>()

我在任何地方都找不到这个引用,到目前为止,我唯一的方法是在同一个容器中注册HubConfiguration实例并执行以下操作:

代码语言:javascript
复制
public MyApiController : ApiController {
  public HubConfiguration HubConfig { get; set; } // Dependency injected by
                                                  // PropertiesAutowired()

  public IHubContext MyHubContext { 
    get { 
      return HubConfig
        .Resolver
        .Resolve<IConnectionManager>()
        .GetHubContext<MyHub>(); 
     } 
  }

  // ...

}

然而,在我看来,这似乎是相当冗长的。正确的方法是什么?更确切地说,是否有一种干净的方式注册IConnectionManager

编辑:

我最后做的事情是:

代码语言:javascript
复制
var container = builder.Build();
hubConfig.Resolver = new AutofacDependencyResolver(container); 

app.MapSignalR("/signalr", hubConfig);

var builder2 = new ContainerBuilder();
builder2
  .Register(ctx => hubConfig.Resolver.Resolve<IConnectionManager>())
  .As<IConnectionManager>();

builder2.Update(container);

但我有一种感觉,一定有一个更容易的方法,让IConnectionManager注入控制器。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-04-07 12:23:59

这个答案有点迟了,但现在开始了。

  • 我推荐强类型的集线器。
  • 您需要为强类型集线器添加特定的注册。
  • 我不使用GlobalHost
    • 相反,我使用为OWIN注册创建的配置。

枢纽宣言

代码语言:javascript
复制
public interface IMyHub
{
    // Any methods here for strongly-typed hubs
}

[HubName("myHub")]
public class MyHub : Hub<IMyHub>

轮毂注册

从您的Autofac注册

代码语言:javascript
复制
// SignalR Configuration
var signalRConfig = new HubConfiguration();

var builder = // Create your normal AutoFac container here

builder.RegisterType<MyHub>().ExternallyOwned(); // SignalR hub registration

// Register the Hub for DI (THIS IS THE MAGIC LINE)
builder.Register(i => signalRConfig.Resolver.Resolve<IConnectionManager>().GetHubContext<MyHub, IMyHub>()).ExternallyOwned();

// Build the container
var container = builder.Build();

// SignalR Dependency Resolver
signalRConfig.Resolver = new Autofac.Integration.SignalR.AutofacDependencyResolver(container);

app.UseAutofacMiddleware(container);
app.MapSignalR("/signalr", signalRConfig);

在后台代码中解析中心

使用AutoFacs AutowiredProperties()扩展方法,它可以解析正确的上下文(如果您愿意,也可以在构造函数中)。

代码语言:javascript
复制
public IHubContext<IMyHub> InstanceHubContext { get; [UsedImplicitly] set; }
票数 19
EN

Stack Overflow用户

发布于 2015-04-22 09:53:28

您可以做的是将一些重复的代码(我假设IHubContext也在其他类中使用并以相同的方式获取)移到容器注册中。

第一件事是注册IHubContext实例,我假设项目中有多个集线器。在这种情况下,服务必须注册为命名服务

代码语言:javascript
复制
builder
    .Register<IHubContext>(c => c.Resolve<IConnectionManager>().GetHubContext<MyHub>())
    .Named<IHubContext>("MyHub");

希望使用IHubContext的类现在可以将其作为构造函数参数或属性接收。但是我们必须告诉容器它应该注入哪个实例。这可以通过多种方式在容器配置中完成。

构造函数可以使用ResolvedParameter正确选择IHubContext实现。

代码语言:javascript
复制
// example class 
public class SampleClass {
    public SampleClass(IHubContext context) { }
}

// and registration for this class
builder.RegisterType<SampleClass>()
    .WithParameter(new ResolvedParameter((pi, ctx) =>
    {
        // only apply this to parameters of IHubContext type
        return pi.ParameterType == typeof(IHubContext);
    }, (pi, ctx) =>
    {
        // resolve context
        return ctx.ResolveNamed<IHubContext>("MyHub");
    }));

资产注入,也有点棘手。需要在OnActivated回调中解析正确的实例,例如:

代码语言:javascript
复制
// example class
public class SampleClass2
{
    public IHubContext Context { get; set; }
}

// registration for this case
builder.RegisterType<SampleClass2>()
    .PropertiesAutowired()
    .OnActivated(e => e.Instance.Context = e.Context.ResolveNamed<IHubContext>("MyHub"));
票数 8
EN

Stack Overflow用户

发布于 2015-06-23 22:48:38

我做了和你相似的事,这让它为我自己工作。

代码语言:javascript
复制
builder.RegisterInstance(config.Resolver).As<IDependencyResolver>();
builder.Update(container);

然后用这个得到我的集线器

代码语言:javascript
复制
Resolve<IDependencyResolver>().Resolve<IConnectionManager>().GetHubContext<MyHub>();

希望这能帮到其他人

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29783898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档