C# ILocalizedStringManager是否跨请求意外重用?

C# ILocalizedStringManager是否跨请求意外重用?,c#,asp.net-mvc,autofac,orchardcms,C#,Asp.net Mvc,Autofac,Orchardcms,我认为这确实出乎意料,因为ILocalizedStringManager是IDependency,这意味着应该始终为每个请求创建它 我在实现类中添加了一些日志记录,如下所示: public class LocalizedStringManager : ILocalizedStringManager { private readonly ITranslator _translator; public LocalizedStringManager(ITranslator transl

我认为这确实出乎意料,因为
ILocalizedStringManager
IDependency
,这意味着应该始终为每个请求创建它

我在实现类中添加了一些日志记录,如下所示:

public class LocalizedStringManager : ILocalizedStringManager
{
    private readonly ITranslator _translator;
    public LocalizedStringManager(ITranslator translator)
    {
        _translator = translator;
        //we defined an OID on ITranslator to help debug this
        Debug.Print($">>>>>>>>> Init LocalizedStringManager ... ({_translator.OID})");
    }
    public string GetLocalizedString(string scope, string text, string cultureName)
    {
        return _translator.Translate(text).Text;
    }
}

public interface ITranslator : IDependency, IDisposable {
    string Translate(string text);
    Guid OID {get;}
}

public class Translator : ITranslator {
   public Guid OID {get;}
   public Translator(){
       OID = Guid.NewGuid();
   }
   public string Translate(string text){
       //...
   }
   public void Dispose(){
       Debug.Print($">>>>>>>>> Disposing ... {OID}");
   }
}
对于第一个请求,我可以看到它被打印出来

>>>>>>>>> Init LocalizedStringManager ... 086a1487-bad9-481d-92f0-4615b9c6c5fd
最后,处理引用的
ITranslator
,并打印以下内容:

>>>>>>>>> Disposing ... 086a1487-bad9-481d-92f0-4615b9c6c5fd
所以这里一切正常,但不知何故,下一个请求(来自浏览器)会通过
NullLocalizer
触发
LocalizedStringManager
,奇怪的是,我没有看到像
>>>>>>>>>>>>Init LocalizedStringManager…
这样的行打印出来,但就在它引发异常之前,我有一条记录行打印出了
ITranslator
OID,它与值
086a1487-bad9-481d-92f0-4615b9c6c5fd
匹配,真让人困惑

下面是为第二个连续请求运行的代码:

public interface ISomeService : IDependency {
     SomeModel LoadData();
}
public class SomeService : ISomeService {
    public Localizer T {get;set;}      
    public SomeService(){
        T = NullLocalizer.Instance;
    }  
    public SomeModel LoadData(){
        //use the Localizer T here, such as to translate some text
        var model = new SomeModel();
        model.SomeText = T("SOME_KEY");
        //...
        return model;
    }
}
因此,
T(…)
将触发一些
LocalizedStringManager
,我真的希望它创建一个新的
ITranslator
,但不知何故它重用了以前在请求中创建的(因为我这次没有看到任何像
>>>>>>>>Init LocalizedStringManager…
这样的行被打印出来。 最后,它还将调用重用的
ITranslator
(其
Translate
方法),但之前(之前的请求之后)已处理过该方法,现在它抛出了一个异常,如下所示:

public class LocalizedStringManager : ILocalizedStringManager
{
    private readonly ITranslator _translator;
    public LocalizedStringManager(ITranslator translator)
    {
        _translator = translator;
        //we defined an OID on ITranslator to help debug this
        Debug.Print($">>>>>>>>> Init LocalizedStringManager ... ({_translator.OID})");
    }
    public string GetLocalizedString(string scope, string text, string cultureName)
    {
        return _translator.Translate(text).Text;
    }
}

public interface ITranslator : IDependency, IDisposable {
    string Translate(string text);
    Guid OID {get;}
}

public class Translator : ITranslator {
   public Guid OID {get;}
   public Translator(){
       OID = Guid.NewGuid();
   }
   public string Translate(string text){
       //...
   }
   public void Dispose(){
       Debug.Print($">>>>>>>>> Disposing ... {OID}");
   }
}
引发异常:Autofac.dll中的“System.ObjectDisposedException”

Autofac.dll中发生“System.ObjectDisposedException”类型的异常,但未在用户代码中处理 无法解析实例,也无法从此LifetimeScope创建嵌套的生存期,因为它已被释放

一切似乎都超出了我的控制。所有这些都是由
Orchard
框架设置的。我真的不明白
LocalizedStringManager
怎么可以如此轻松地重用?它不应该以这种方式重用。我们现在经常遇到这种异常(在尝试通过多语言支持使我们的网站全球化之后)

尤其是这种情况并不总是可以重现的(我的意思是这种情况会断断续续发生)。我希望对
Orchard
有足够经验的人至少能给我一些好的建议,这些建议可能会导致这个问题。谢谢

更新: 我无法提供确切的实际代码(逐字),但主要逻辑如下(这里最不同的是
IDisposable
未实现和
IRepository
用于
ITranslator
实现):

公共接口ITranslator:IDependency{
字符串翻译(字符串文本);
LanguageInfo GetCurrentUserLanguage();
}
公共类语言信息{
公共字符串名称{get;set;}
公共字符串DisplayName{get;set;}
}
公共类转换器:ITranslator{
只读IRepository语言库;
只读IOrchardServices\u orchardServices;
公共翻译(IRepository LanguagePO,
IOrchardServices果园服务){
_languageRepo=languageRepo;
_果园服务=果园服务;
}
公共语言信息GetCurrentUserLanguage(){
if(_orchardServices.WorkContext.CurrentUser==null){
//从浏览器的cookie中获取未登录用户的语言
var langCode=_orchardServices.WorkContext.HttpContext.Request.Cookies[“langCode”]??“en”;
//获取完整的语言信息
//这就是引发异常的地方(因为使用了已处置的存储库)
var fullInfo=\u languageRepo.Table.FirstOrDefault(e=>e.Code==langCode);
返回新语言信息{Name=fullInfo.Name,DisplayName=fullInfo.DisplayName};
}否则{
//从数据库获取当前用户的设置
//但是,我的测试针对的是未登录的案例用户
//所以这个分支在这个具体问题上并不重要。
//...
}
}
公共字符串翻译(字符串文本){
//获取当前用户语言
var lang=GetCurrentUserLanguage();
//翻译…(在这个具体问题中不重要)
//...
}   
}
我必须再次指出,这种情况是断断续续发生的,无法确保它可以轻松复制(这是最难理解的原因),尤其是在您可以复制一次之后。就我而言,在启动主页之后,会多次调用
GetCurrentUserLanguage
(每次翻译),一切都很好。但是所有调用都是从razor视图内部的
T(…)
发起的

然而,在点击一个链接(调用api
ISomeService
)后会引发异常,有些人使用翻译,但他们使用
T
作为Orchard的网页库的一部分(在razor视图中呈现),这些链接至少在我第一次尝试浏览网站时不会导致异常。现在奇怪的是(正如我在重新访问该链接时间歇性地使用这个词所描述的那样,异常不会抛出。实际上从现在起,我几乎无法复制它,但对于制作网站,我们仍然可以看到相当多的日志行显示间歇性事件(我确信其中许多是使用
T)(…)
在razor视图中,而不仅仅是在
ISomeService
中,因为我可以第一次轻松地重现异常)

请注意,上面的代码不是很好,不是我自己写的(我们有一个由几个成员组成的团队)。我知道应该对它进行重构,但现在做这件事还不是时候,即使像我做的那样解决这个问题也是j