当前位置: 首页 > 知识库问答 >
问题:

我应该如何注册使用MongoClient、Singleton或Scoped的mongodb服务?

宗政卓
2023-03-14
public class UserService
{
    private readonly IMongoCollection<User> _books;
    private readonly IPasswordHasher _passwordService;

    public UserService(IBookstoreDatabaseSettings settings,  IPasswordHasher passwordService)
    {
        var client = new MongoClient(settings.ConnectionString);
        var database = client.GetDatabase(settings.DatabaseName);

        _books = database.GetCollection<User>(settings.UsersCollectionName);
        _passwordService = passwordService;
    }

    public List<User> Get() =>
        _books
        .Find(book => true)
        .ToList();

    public User Get(string id) =>
        _books.Find(user => user.Id == id).FirstOrDefault();

    public User Create(User user)
    {
        var password = this._passwordService.HashPassword(user.Password);
        user.Password = password;
        _books.InsertOne(user);
        return user;
    }
    public void Update(string id, User bookIn) =>
        _books.ReplaceOne(book => book.Id == id, bookIn);

    public void Remove(User bookIn) =>
        _books.DeleteOne(book => book.Id == bookIn.Id);

    public void Remove(string id) =>
        _books.DeleteOne(book => book.Id == id);
}
services.AddSingleton<UserService>();
            services.AddSingleton<BookService>();
            services.AddSingleton<AuthenticationService>();
            services.AddScoped<IPasswordHasher, PasswordHasher>();

共有1个答案

通正平
2023-03-14

版本2.10的MongoB.NET驱动程序参考文档在Mongo客户端重用部分的参考>驱动程序>连接页中解释了以下内容:

建议将MongoClient实例存储在全局位置,可以作为静态变量存储,也可以存储在具有单例生存期的IoC容器中。

关于Mongo数据库重用,它没有提到单例生存期,但它确实说它“是线程安全的,并且可以安全地全局存储”,所以我将其解释为,如果您的实现希望将它安全地存储为单例,但如果您喜欢另一个生存期,则不需要这样。

 类似资料:
  • 问题内容: 的(Java持久性API)规范有2名不同的方式来指定实体组合键:和。 我在映射的实体上同时使用了这两个注释,但是对于不太熟悉的人来说,这真是一个大麻烦。 我只想采用一种指定复合键的方法。哪个真的是最好的?为什么? 问题答案: 我认为这可能更冗长,因为无法使用任何字段访问运算符来访问整个主键对象。使用,您可以这样做: 这给构成组合键的字段提供了清晰的概念,因为它们都聚集在通过字段访问运算

  • 问题内容: 我正在开发RESTful Web服务,并且在阅读Jersey 文档时遇到了一个注释 在我的Web服务中,我主要是根据作为参数提供的唯一键返回数据。当传递Student_Id时,将类推返回学生的所有信息。 所以我的问题是什么时候适合这种Web服务? 根据文档 如果在请求处理中多次使用资源,则将始终使用同一实例。 那么在那种情况下我们不应该费心使用权利吗? 还有什么用例,我们必须为每个请求

  • 为了使我们的Azure Web应用程序能够访问Azure Key Vault,我们使用证书和服务主体的应用程序注册。 在生成证书之后,我们使用下面的Azure PowerShell创建应用程序注册和服务主体,然后授予服务主体访问Azure密钥库的权限。然后Web应用程序加载此证书,并使用它与Azure Key Vault进行身份验证。一切正常。 问题就出在这一行:

  • 是否建议使用android云备份来备份GCM id?我将GCM id存储在SharedReferences中,因此我不必继续注册。 如果我备份此GCM sharedpref和用户更改设备,我是否需要将其更新为新的注册id?注册ID是否特定于设备?当用户更改设备并备份时会发生什么情况? 我试着从文档中读到: 您必须排除任何特定于设备的标识符,无论是由服务器发布的还是在设备上生成的。这包括谷歌云消息(

  • 本文向大家介绍浅谈.net core 注入中的三种模式:Singleton、Scoped 和 Transient,包括了浅谈.net core 注入中的三种模式:Singleton、Scoped 和 Transient的使用技巧和注意事项,需要的朋友参考一下 从上篇内容不如题的文章《.net core 并发下的线程安全问题》扩展认识.net core注入中的三种模式:Singleton、Scope

  • 我使用Netflix的Eureka注册了许多微服务,并且我正在使用Spring Cloud Config。但是,当我更新时,我需要重新启动应用程序以应用新属性。 重新启动应用程序有点烦人,所以我搜索了它,发现通过使用Netflix Eureka获得注册的微服务,并使用spring boot actuator刷新它,但我没有获得注册的微型服务。 简而言之:我如何使用网飞尤里卡注册微服务?