Добавление MongoDb в DI контейнер gRPC сервиса
Планируется по нажатию кнопки "войти" кидать запрос на сервис, где он бы вытаскивал данные пользователя
public sealed class UserRepository : IUserRepository
{
private readonly Repository _repository;
private readonly IMapper<User, UserDocument> _userDocumentMapper;
private readonly IMapper<UserDocument, User> _documentUserMapper;
public UserRepository(Repository repository,
UserDocumentMapper userDocumentMapper,
IMapper<UserDocument, User> documentUserMapper)
{
_repository = repository;
_userDocumentMapper = userDocumentMapper;
_documentUserMapper = documentUserMapper;
}
private IMongoCollection<UserDocument> Users => _repository.Database.GetCollection<UserDocument>(CollectionsNames.Users);
public async Task<User> GetUser(string id)
{
var user = await Users.Find(new BsonDocument("_id", new ObjectId(id))).FirstOrDefaultAsync();
return _documentUserMapper.Map(user);
}
// проверка есть ли уже такой логин в бд
public async Task<bool> CheckLogin(string login) =>
await Users
.Find(Builders<UserDocument>.Filter.Eq(u => u.Login, login))
.FirstOrDefaultAsync() is null;
public async Task<User> GetUserValidation(string login)
{
if (string.IsNullOrWhiteSpace(login))
return null;
var user = await Users.Find(Builders<UserDocument>.Filter.Eq(u=> u.Login, login)).FirstOrDefaultAsync();
return _documentUserMapper.Map(user);
}
public async Task Create(User user)
{
await Users.InsertOneAsync(_userDocumentMapper.Map(user));
}
public IEnumerable<User> GetUsersByName(string name)
{
return Users
.Find(Builders<UserDocument>.Filter.Eq(u => u.UserName, name))
.ToEnumerable()
.Select(_documentUserMapper.Map);
}
IUserRepository:
namespace Domain.Repositories.Users
{
public interface IUserRepository
{
[CanBeNull]
Task<User> GetUser([NotNull] string id);
Task<bool> CheckLogin([NotNull] string login);
[CanBeNull]
Task<User> GetUserValidation([NotNull] string login);
Task Create([NotNull] User user);
[CanBeNull]
IEnumerable<User> GetUsersByName([NotNull] string name);
}
}
Repository:
[UsedImplicitly]
public sealed class Repository
{
/*переменная, которая подключает вас к хосту mongo*/
private const string Host = "mongodb+srv://alexzonic:[email protected]/MessengerDB?retryWrites=true&w=majority";
// это будет именем базы данных, в которой хранятся коллекции
private const string DbName = "MessengerDB";
private readonly IMongoClient _client;
public IMongoDatabase Database { get; }
public Repository()
{
if (_client is null) // так client будет всего 1
{
_client = new MongoClient(Host);
Database = _client.GetDatabase(DbName);
}
}
}
Вот Startup сервиса:
public void ConfigureServices(IServiceCollection services)
{
services.AddGrpc();
services.AddAutoMapper(typeof(Startup));
services.AddTransient<Repository>();
services.AddTransient<IUserRepository, UserRepository>();
services.AddGrpcReflection();
}
Сервис не запускается, выкидывает Exception
Unhandled exception. System.AggregateException: Some services are not able to be constructed (Error while valid ating the service descriptor 'ServiceType: Domain.Repositories.Users.IUserRepository Lifetime: Transient Implem entationType: Domain.Repositories.Users.UserRepository': Unable to resolve service for type 'Domain.Mappers.Use rDocumentMapper' while attempting to activate 'Domain.Repositories.Users.UserRepository'.)