摘自:http://docs.autofac.org/en/latest/integration/signalr.html
“OWIN集成中的一个常见错误是使用GlobalHost。在OWIN中,您可以从头创建配置。在使用OWIN集成时,不应该引用GlobalHost。”
听起来很合理。但是,应该如何从一个IHubContext解析ApiController,比如通常的(非OWIN):
GlobalHost.ConnectionManager.GetHubContext<MyHub>()
我在任何地方都找不到这个引用,到目前为止,我唯一的方法是在同一个容器中注册HubConfiguration实例并执行以下操作:
public MyApiController : ApiController {
public HubConfiguration HubConfig { get; set; } // Dependency injected by
// PropertiesAutowired()
public IHubContext MyHubContext {
get {
return HubConfig
.Resolver
.Resolve<IConnectionManager>()
.GetHubContext<MyHub>();
}
}
// ...
}然而,在我看来,这似乎是相当冗长的。正确的方法是什么?更确切地说,是否有一种干净的方式注册IConnectionManager?
编辑:
我最后做的事情是:
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注入控制器。
发布于 2016-04-07 12:23:59
这个答案有点迟了,但现在开始了。
枢纽宣言
public interface IMyHub
{
// Any methods here for strongly-typed hubs
}
[HubName("myHub")]
public class MyHub : Hub<IMyHub>轮毂注册
从您的Autofac注册
// 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()扩展方法,它可以解析正确的上下文(如果您愿意,也可以在构造函数中)。
public IHubContext<IMyHub> InstanceHubContext { get; [UsedImplicitly] set; }发布于 2015-04-22 09:53:28
您可以做的是将一些重复的代码(我假设IHubContext也在其他类中使用并以相同的方式获取)移到容器注册中。
第一件事是注册IHubContext实例,我假设项目中有多个集线器。在这种情况下,服务必须注册为命名服务。
builder
.Register<IHubContext>(c => c.Resolve<IConnectionManager>().GetHubContext<MyHub>())
.Named<IHubContext>("MyHub");希望使用IHubContext的类现在可以将其作为构造函数参数或属性接收。但是我们必须告诉容器它应该注入哪个实例。这可以通过多种方式在容器配置中完成。
构造函数可以使用ResolvedParameter正确选择IHubContext实现。
// 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回调中解析正确的实例,例如:
// 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"));发布于 2015-06-23 22:48:38
我做了和你相似的事,这让它为我自己工作。
builder.RegisterInstance(config.Resolver).As<IDependencyResolver>();
builder.Update(container);然后用这个得到我的集线器
Resolve<IDependencyResolver>().Resolve<IConnectionManager>().GetHubContext<MyHub>();希望这能帮到其他人
https://stackoverflow.com/questions/29783898
复制相似问题