汽车难题

本文关键字:难题 汽车 | 更新日期: 2023-09-27 17:56:57

我使用Autofac作为我选择的IoC容器。这个问题的其余部分指的是SignalR和SignalR,但不需要真正的SignalR知识来回答;这是一个植根于Autofac的问题。

作为使用 Autofac 作为 SignalR 的依赖项解析程序的一部分,我想提供我自己的 IJsonSerializer 实例,按照我喜欢的方式配置它。但是,我不希望在软件的其余部分中共享IJsonSerializer实例。

为此,我创建了一个包含额外注册的新生存期范围,并将该范围提供给依赖项解析程序。这就是我的问题开始的时候。

我没有意识到的是,通过这样做,以前从根容器检索的从 SignalR 请求的每生存期范围的实例依赖项现在正在从生存期范围请求,因此在整个 SignalR 之间共享。这不好。例如,短期数据库会话现在在我的应用程序的生存期内共享。

如何使我的实例每个生存期范围的依赖项基本上假装我传递给 SignalR 的生存期范围不应用于重用这些依赖项?或者,如何避免完全创建生存期范围?

汽车难题

这个问题已经有几个月了,但我想我会和你分享我使用的方法(也许有人可以改进它)。

我向中心添加了一个事件,以便在中心释放后触发。(实际上通过一个基本集线器,因为我已经有一些通用逻辑了)

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

我最终重写了 SignalR 的 Autofac 集成,以支持通过依赖 Autofac MVC 支持为每个 HTTP 上下文创建生命周期范围:

https://github.com/bytenik/Autofac.Integration.Mvc.SignalR

(请注意,这是Autofac.Integration。MVC.SignalR,而不是Autofac.Integration.SignalR。

您可以考虑将首选的 IJsonSerializer 实现设置为命名或键控注册,由依赖它的组件专门请求。 我对 SignalR 的了解还不够多,无法告诉您如何或在何处完成此操作,但它可能会帮助您找到可行的解决方案。

有关更多详细信息:http://code.google.com/p/autofac/wiki/TypedNamedAndKeyedServices