我认为使用我自己的 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/