Cod*_*ely 2 c# structuremap dependency-injection asp.net-mvc-4 signalr
在Global.asax的Application_Start中,我有以下内容
ObjectFactory.Initialize(cfg => {
cfg.For<IDependencyResolver>().Singleton().Add<StructureMapDependencyResolver> ();
});
Run Code Online (Sandbox Code Playgroud)
我的Hub接口是
public interface IDashboardHub
{
void Initialize();
}
Run Code Online (Sandbox Code Playgroud)
我的中心如下:
public class DashboardHub : Hub, IDashboardHub
{
private readonly ICpeAccountService _accountService;
public DashboardHub(ICpeAccountService service)
{
_accountService = service;
}
[Authorize]
public void Initialize()
{
Clients.All.UpdateStatus("Hello World!!!");
}
}
Run Code Online (Sandbox Code Playgroud)
如果我删除注入的构造函数和解析器,那么我得到"Hello World"信号,JavaScript显示值.如果我只是删除解析器,那么signalR不再找到无参数构造函数,并且不会调用Initialize方法.
如果我包含StructureMap依赖项解析器(它正在工作并立即注入大约40个其他类),那么我得到以下异常消息
StructureMap configuration failures: Error: 104
Source: Registry: StructureMap.Configuration.DSL.Registry, StructureMap,
Version=2.6.4.0, Culture=neutral, PublicKeyToken=e60ad81abae3c223
Type Instance '87da3c00-4deb-4334-b189-021d445d95ec'
(Configured Instance of App.DependencyResolution.StructureMapDependencyResolver,
App, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null)
Cannot be plugged into type Microsoft.AspNet.SignalR.IDependencyResolver,
Microsoft.AspNet.SignalR.Core, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=31bf3856ad364e35
Run Code Online (Sandbox Code Playgroud)
此外,如果我尝试在startup.cs中解决所有问题,如下所示:
public void Configuration(IAppBuilder app)
{
ObjectFactory.Initialize(cfg =>
{
cfg.For<IDependencyResolver>()
.Singleton()
.Add<StructureMapDependencyResolver>();
});
app.MapSignalR();
}
Run Code Online (Sandbox Code Playgroud)
我也得到了同样的错误.
有没有人能够解决这个问题?
最简单的方法是使用HubActivator
启动时你需要的只是cs
public void Configuration(IAppBuilder app)
{
app.MapSignalR();
}
Run Code Online (Sandbox Code Playgroud)
为您的集线器创建一个Activator
public class HubActivator : IHubActivator
{
private readonly IContainer container;
public HubActivator(IContainer container)
{
this.container = container;
}
public IHub Create(HubDescriptor descriptor)
{
return (IHub)container.GetInstance(descriptor.HubType);
}
}
Run Code Online (Sandbox Code Playgroud)
确保在app_start中注册此激活器
IContainer container = StructureMap.Container();
// Register a Hub Activator for SignalR
GlobalHost.DependencyResolver.Register(typeof(IHubActivator), () => new HubActivator(container));
Run Code Online (Sandbox Code Playgroud)
然后删除任何不需要的SignalRDependencyResolver代码......
| 归档时间: |
|
| 查看次数: |
1264 次 |
| 最近记录: |