Добавление 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'.)


Ответы (0 шт):