【问题标题】:How do you Resolve signalR v2.0 with StructureMap v2.6你如何用 StructureMap v2.6 解决 signalR v2.0
【发布时间】:2013-12-20 14:34:44
【问题描述】:

在 Global.asax 的 Application_Start 中,我有以下内容

 ObjectFactory.Initialize(cfg => {
     cfg.For<IDependencyResolver>().Singleton().Add<StructureMapDependencyResolver>    ();
 });

我的 Hub 界面是

public interface IDashboardHub
{
    void Initialize();
}

我的hub如下:

public class DashboardHub : Hub, IDashboardHub
{
    private readonly ICpeAccountService _accountService;

    public DashboardHub(ICpeAccountService service)
    {
        _accountService = service;
    }

    [Authorize]
    public void Initialize()
    {
        Clients.All.UpdateStatus("Hello World!!!");
    }
}

如果我删除注入的构造函数和解析器,那么我会收到“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

另外,如果我尝试在 startup.cs 中解决这一切,像这样:

public void Configuration(IAppBuilder app)
{
    ObjectFactory.Initialize(cfg =>
    {
            cfg.For<IDependencyResolver>()
               .Singleton()
               .Add<StructureMapDependencyResolver>();
        });

    app.MapSignalR();
}

我也遇到同样的错误。

有人能解决这个问题吗?

【问题讨论】:

    标签: c# asp.net-mvc-4 dependency-injection signalr structuremap


    【解决方案1】:

    最简单的方法是使用 HubActivator

    你在启动时只需要cs就是

    public void Configuration(IAppBuilder app)
    {
        app.MapSignalR();
    }
    

    为您的集线器创建激活器

    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);
        }
    }
    

    确保在 app_start 中注册此激活器

    IContainer container = StructureMap.Container();
    
    // Register a Hub Activator for SignalR
    GlobalHost.DependencyResolver.Register(typeof(IHubActivator), () => new HubActivator(container));
    

    然后删除任何不需要的 SignalRDependencyResolver 代码...

    【讨论】:

    • 找到一个比他在 asp.net SignalR 示例中给出的更清洁的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    • 2015-12-11
    • 2022-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-09
    相关资源
    最近更新 更多