我现在开始使用SignalR,并且一旦完成所有配置,它就会很好用。但是,我从事的几乎所有应用程序都使用CaSTLe Windsor,因此能够将它们一起使用将是很棒的。我想要这样做的原因是,我可以在持久连接内部使用CaSTLe依赖项/服务。

我在源代码中进行了挖掘,似乎可以将DependencyResolver替换为基于CaSTLe的城堡(即实现IDependencyResolver的CaSTLe),或者可以将DependencyResolver的用法更改为CaSTLe。

其中哪一个是更好的主意?我还有其他方法可以结合使用CaSTLe和SignalR吗?

谢谢,
埃里克

最佳答案

2016年8月更新
在评论之后,我不再使用下面的方法,而是现在使用GlobalHost.DependencyResolver
所以在Global.asax.cs中,我初始化了一些东西

public static void Init(IWindsorContainer container)
{
    var conn = configurationManager.ConnectionStrings["SRSQL"].ConnectionString;
    GlobalHost.DependencyResolver.Register(typeof(IHubActivator),
                                      () => new SignalHubActivator(container));
    GlobalHost.DependencyResolver.Register(typeof(ILoggingService),
                                      container.Resolve<ILoggingService>);
    //etc or you could just pass your existing container to the resolver
    GlobalHost.DependencyResolver.UseSqlServer(conn);
}
然后在中心
private ILoggingService LoggingService{ get; set; }

    public NotificationHub()
    {
        LoggingService = GlobalHost.DependencyResolver.Resolve<ILoggingService>();
    }
为了完整性
public class SignalHubActivator: IHubActivator
{
    private readonly IWindsorContainer _container;

    public SignalHubActivator(IWindsorContainer container)
    {
        _container = container;
    }


    public IHub Create(HubDescriptor descriptor)
    {
                var result=  _container.Resolve(descriptor.HubType) as IHub;

        if (result is Hub)
        {
            _container.Release(result);
        }

    return result;
    }

}
2012年的旧答案
我选择了设置我们自己的DependencyResolver的第一个选项
AspNetHost.SetResolver(new SignalResolver(_container));
如果需要,我可以提供SignalResolver,但为了便于阅读,现在不再赘述。
另一个重要的注意事项是集线器必须有一个空的构造函数,这样我们的城堡容器才能通过属性(例如
public class NotificationHub : Hub, INotificationHub
    {

public INotificationService NotificationService { get; set; }
并且解析器要求
public class SignalResolver : DefaultDependencyResolver
    {
        private readonly IWindsorContainer _container;

        public SignalResolver(IWindsorContainer container)
        {
            if (container == null)
            {
                throw new ArgumentNullException("container");
            }
            _container = container;
        }

        public override object GetService(Type serviceType)
        {
            return TryGet(serviceType) ?? base.GetService(serviceType);
        }

        public override IEnumerable<object> GetServices(Type serviceType)
        {
            return TryGetAll(serviceType).Concat(base.GetServices(serviceType));
        }

        private object TryGet(Type serviceType)
        {
            try
            {
                return _container.Resolve(serviceType);
            }
            catch (Exception)
            {
                return null;
            }
        }

        private IEnumerable<object> TryGetAll(Type serviceType)
        {
            try
            {
                var array = _container.ResolveAll(serviceType);
                return array.Cast<object>().ToList();
            }
            catch (Exception)
            {
                return null;
            }
        }
    }

关于asp.net-mvc - 将温莎城堡与SignalR集成-我该如何处理?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10507894/

10-10 10:25