mongodb服务-单例还是有范围的? - c#

我正在使用Mongodb构建带有ASP.NET核心的API,并且我具有不同的服务,用户服务家庭服务等。我想知道我应该将每个服务注册为asp.net核心文档中提到的单例还是作用域。链接到存储库https://github.com/krisk0su/apartments

UserService.cs

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

Startup.cs

services.AddSingleton<UserService>();
            services.AddSingleton<BookService>();
            services.AddSingleton<AuthenticationService>();
            services.AddScoped<IPasswordHasher, PasswordHasher>();

参考方案

版本2.10的MongoDB .NET Driver参考文档在Mongo Client Reference > Driver > Connecting部分的Re-use页上进行了说明:

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

关于Mongo数据库Re-use,它没有提到单例生命期,但它确实说它“是线程安全的,可以安全地全局存储”,因此我将其解释为意味着它可以作为单例安全地存储。如果那是您的实现所需要的,但是如果您希望有另一个生存期,则不必如此。

IMongoDatabase提供的MongoClient的实现是线程安全的,可以安全地全局存储或存储在IoC容器中。

关于Mongo Collection Re-use的情况相同:

最终由IMongoCollection<TDocument>提供的MongoClient的实现是线程安全的,并且可以安全地全局存储或存储在IoC容器中。

因此,我再次解释说,寿命的选择取决于您的特定要求。

似乎只有MongoClient带有使用单例寿命的建议。

与哪些运算符>>兼容 - java

我这里没有什么代码int b=3; b=b >> 1; System.out.println(b); 它可以完美工作,但是当我将变量b更改为byte,short,float,double时,它包含错误,但是对于变量int和long来说,它可以完美工作,为什么它不能与其他变量一起工作? 参考方案 位移位运算符(例如>>)与任何整数类型兼…

>> Python中的运算符 - python

>>运算符做什么?例如,以下操作10 >> 1 = 5有什么作用? 参考方案 它是右移运算符,将所有位“右移”一次。二进制10是1010移到右边变成0101这是5

Python 3运算符>>打印到文件 - python

我有以下Python代码编写项目的依赖文件。它可以在Python 2.x上正常工作,但是在使用Python 3进行测试时会报告错误。depend = None if not nmake: depend = open(".depend", "a") dependmak = open(".depend.mak&#…

是否可以在Java项目中使用.Net GUI? - c#

作为一个初学者,我想问一下在Java项目中可以使用.Net(最好是C#)GUI的任何方法吗?那是因为我觉得C#可以比Java更好,更轻松地设计GUI,但是据我所知,J2EE比C#更加强大(没有源代码,如果我输入错误,请纠正我)。那么,有可能吗?在Java中运行C#UI? 参考方案 C#没有UI。 .Net具有(Winforms,Silverlight,WPF…

剃刀付款集成->如何通过关闭按钮X检测剃刀付款模型是否关闭 - javascript

当用户关闭而无需付款时,我在CI框架中使用Razorpay,请创建razor支付模型,然后取消订单,我希望按状态更改为已取消的状态触发查询。所以我怎么能检测到这一点。我已经通过单击jQuery单击关闭功能但无法使用... javascript大神给出的解决方案 Razorpay提供了JS方法来检测模式关闭。您编写的任何JS代码都不会在结帐页面上运行,因为它是…