我选择使用Autofac作为我的IoC容器。这个问题的其余部分涉及SignalR和SignalR,但不需要真正的SignalR知识来回答;这是一个根源于Autofac的问题。
作为使用Autofac作为SignalR依赖解析器的一部分,我想提供我自己的IJsonSerializer实例,按照我喜欢的方式进行配置。但是,我不希望在软件的其余部分中共享该IJsonSerializer实例。
为此,我创建了一个带有附加注册的新生命周期作用域,并将该作用域提供给依赖项解析器。这就是我的问题开始的时候。
我没有意识到的是,通过这样做,从SignalR请求的每个生命周期范围的实例依赖关系,以前是从根容器检索的,现在从生命周期范围请求,因此在整个SignalR中共享。这真是不太好。例如,短暂的数据库会话现在在我的应用程序的生命周期中被共享。
我如何才能使我的每个生命周期范围的实例依赖关系基本上假装我传递给SignalR的生命周期范围不应该用来导致这些依赖关系被重用呢?或者,如何避免完全创建生命周期作用域?
发布于 2013-04-21 19:25:25
这个问题已经有几个月了,但我想我会和你分享我使用的方法(也许有人可以改进它)。
public event Action OnDisposing;
protected override void Dispose(bool disposing)
{
if (OnDisposing != null) OnDisposing.Invoke();
}有了这些,我就修改了autofac注册这个集线器的方式。解析时,将创建一个新的生存期作用域,并将该作用域的dispose方法设置为在释放集线器时激发。
builder.Register(x =>
{
ILifetimeScope scope = x.Resolve<ILifetimeScope>().BeginLifetimeScope();
MyHub hub = new MyHub(scope.Resolve<IMyDependency>());
hub.OnDisposing += scope.Dispose;
return hub;
})
.As<MyHub>().InstancePerDependency();发布于 2013-02-02 23:16:35
我最终重写了SignalR的Autofac集成,通过依赖Autofac MVC支持来支持为每个HTTP上下文创建生命周期范围:
https://github.com/bytenik/Autofac.Integration.Mvc.SignalR
(请注意,这是Autofac.Integration.Mvc.SignalR,而不是Autofac.Integration.SignalR。)
发布于 2013-02-02 01:34:43
您可以考虑将首选的IJsonSerializer实现设置为命名注册或键控注册,由依赖它的组件专门请求。我对SignalR的了解还不够多,无法告诉您如何或在何处实现,但它可能会帮助您找到一个可行的解决方案。
有关更多细节,请访问:http://code.google.com/p/autofac/wiki/TypedNamedAndKeyedServices
https://stackoverflow.com/questions/14651794
复制相似问题