22

当我在 global.cs 文件中进行绑定时,我不太确定何时应该使用 SingletonScope()、TransientScope() 和 RequestScope()。

例如,我对 MongoSession 的调用(使用 NoRM 和 mvcStarter 项目http://mvcstarter.codeplex.com/)设置为 SingletonScope 但我创建了一个使用此 MongoSession 对象的存储库,以便更轻松地调用 Mongo,例如,我有一个 NewsRepository,它使用 MongoSession 从数据中获取我的新闻项目。例如,我有一个调用来获取 DisplayOnHome 设置为 true 并通过 CreationDate 获取最新的新闻项目。这样的存储库应该是 SingletonScope 还是 RequestScope 更合适?

我应该什么时候使用它们,为什么?

4

4 回答 4

21

一般来说,在 Web 应用程序中,您希望状态尽可能地成为请求范围。

只有在非常低级别优化的情况下,您才可能遇到适合创建单例对象的情况(即使那样,您也有可能将此类缓存/共享逻辑拉到另一个被拉入的类中作为对您的其他 [请求范围] 对象的依赖项并创建单例范围)。请记住,Web 应用程序上下文中的单例意味着多个线程使用相同的对象。这很少是好消息。

同样,瞬态作用域是最直接的默认值(这就是 Ninject 2 这样做的原因)——请求作用域只有在出于性能原因等需要共享某些东西时才应考虑在内(或者因为这只是上下文共享 [如其他答案中所述])。

于 2010-07-27T21:41:03.993 回答
3

我想答案将取决于您是否MongoSession代表一个工作单元。我使用过的大多数与数据库相关的类(主要是在 ORM 的上下文中,例如 NHibernate 或 EF4)都围绕表示一个工作单元的上下文、实体和跟踪状态。一个工作单元的保留时间不应超过执行给定工作单元所需的时间长度,之后该单元应被提交或回滚。这意味着你应该使用RequestScope.

如果您MongoSession不是工作单元,则可以在 MVC 会话的整个生命周期内保留它,在这种情况下SessionScope是合适的。

于 2010-07-27T21:40:15.107 回答
0

从上面@shankbond 要求的已删除问题中


Disposal 不一定像人们假设的那样在您的主请求线程上同步执行。

您可能希望在请求中的适当阶段存储 aBlock然后Dispose()它(您将如何处理异常?)

查看 Ninject 测试以获取更多示例(说真的,去看看 - 它们简短而清晰,当我第三次听到我被告知时我没有后悔!)

http://kohari.org/2009/03/06/cache-and-collect-lifecycle-management-in-ninject-20/

于 2016-11-10T19:43:53.683 回答
-1

我也有这个问题,最近,我开始研究 MongoDB。MongoDB 建议 MongoClient 使用单例。所以我仍然不确定我的实现,我很困惑。我在DI容器中实现Mongo有两种方式,不知道哪一种好。让我们采取第一种方法

  1. 这里我返回一个 IMongoClient 的单例实例

    services.AddSingleton(_ => { return new MongoClient(con.ConnectionString); });

然后,

services.AddScoped<IMongoDatabase>(s =>
                {
                    var client = p.GetRequiredService<IMongoClient>();
                    return client.GetDatabase(con.DatabaseName);
                });

然后,为我的 IMongoDatabase 返回一个范围。在我的仓库中,我注入了 IMongoDatabase 然后调用我的数据库。

    _dataContext = mongoDBClient.GetCollection<SomeCollection>(GetCollectionNameFromAppSetting((settings.DPUBotCollectionName)));

第二个我将 IMongoDatabase 作为单例返回:

services.AddSingleton<IMongoDatabase>(_ =>
            {
                //var connectionString = con;

                return new 
         MongoClient(con.ConnectionString).GetDatabase("SomeDatabase");
            });

Monog 说他们的 MonogClient 和 IMongoDatabase 是线程安全的。我不确定哪种方法是正确的。如果你能给我一个答案,我将不胜感激。

于 2021-10-06T16:19:35.480 回答