c# - 将简单注入(inject)器与 SignalR 结合使用

标签 c# signalr simple-injector

我认为使用我自己的 IoC 与 SignalR 会非常直接,也许是这样;很可能我做错了什么。这是我到目前为止的代码:

private static void InitializeContainer(Container container)
{

   container.Register<IMongoHelper<UserDocument>, MongoHelper<UserDocument>>();
   // ... registrations like about and then:
   var resolver = new SimpleInjectorResolver(container);
   GlobalHost.DependencyResolver = resolver;
}

然后是我的课:

public class SimpleInjectorResolver : DefaultDependencyResolver
{
    private Container _container;
    public SimpleInjectorResolver(Container container)
    {
        _container = container;
    }

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

    public override IEnumerable<object> GetServices(Type serviceType)
    {
        return _container.GetAllInstances(serviceType) ?? base.GetServices(serviceType);
    }
}

最终发生的是我收到无法解析 IJavaScriptProxyGenerator 的错误,所以我想,我会添加注册:

container.Register<IJavaScriptProxyGenerator, DefaultJavaScriptProxyGenerator>(
    ConstructorSelector.MostParameters);

但是还有很多其他的!我开始:

container.Register<IDependencyResolver, SimpleInjectorResolver>();
container.Register<IJavaScriptMinifier, NullJavaScriptMinifier>();
container.Register<IJavaScriptProxyGenerator, DefaultJavaScriptProxyGenerator>(
    ConstructorSelector.MostParameters);
container.Register<IHubManager, DefaultHubManager>();
container.Register<IHubActivator, DefaultHubActivator>();
container.Register<IParameterResolver, DefaultParameterResolver>();
container.Register<IMessageBus, InProcessMessageBus>(ConstructorSelector.MostParameters);

这仍然给我“找不到类型 ITraceManager 的注册。” ......但现在我想知道我是否完全正确地做这件事,因为我希望我不需要重新连接 SignalR 正在做的一切......对吗?希望?如果不是,我会继续努力,但我是 SignalR 和 Simple Injector newb,所以我想先问一下。 :)

附加:https://cuttingedge.it/blogs/steven/pivot/entry.php?id=88因为 SignalR 有多个构造函数。

最佳答案

好吧,我昨天试过了,我找到了解决方案。 根据我的说法,我希望在 SignalR 中进行依赖注入(inject)的唯一时刻是我的集线器:我不关心 SignalR 在内部是如何工作的! 因此,我没有替换 DependencyResolver,而是创建了自己的 IHubActivator 实现:

public class SimpleInjectorHubActivator : IHubActivator
{
    private readonly Container _container;

    public SimpleInjectorHubActivator(Container container)
    {
        _container = container;
    }

    public IHub Create(HubDescriptor descriptor)
    {
        return (IHub)_container.GetInstance(descriptor.HubType);
    }
}

我可以这样注册(在 Application_Start 中):

var activator = new SimpleInjectorHubActivator(container);
GlobalHost.DependencyResolver.Register(typeof(IHubActivator), () => activator);
RouteTable.Routes.MapHubs();

关于c# - 将简单注入(inject)器与 SignalR 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10555791/

相关文章:

c# - 装饰通用注册的子集

c# - 从 .net core 6.0 连接到在 Docker 中运行的 Sql Edge Server

asynchronous - 在 SignalR 中运行异步任务

swift - 使用 SwiftR 的 Swift 中的 SignalR - 协商请求期间出错

asp.net - 如何在 SignalR2 中设置 Json 序列化器设置?

asp.net-mvc - 简单的注入(inject)器 : How to register event handlers instances to the event dispatcher

c# - 使用 Owin 和简单注入(inject)器进行 UserManager 依赖注入(inject)

c# - 可枚举或列表的属性

c# - JSON 数组到 ExpandoObject 通过 JSON.NET

c# - 在 C# 中如何为方程分配上标?