Общий репозиторий и общий контекст для mongodb - PullRequest
0 голосов
/ 19 мая 2018

Я попытался реализовать общий репозиторий и общий контекст для использования с mongodb.Проблема, с которой я столкнулся, заключается в том, что я получаю следующее сообщение об ошибке:

Не удается разрешить службу для типа 'CommonLibrary.Database.GenericContext`

Вот моя служба настройкиметод из класса запуска:

 public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();

        services.Configure<Settings>(
            options =>
            {
                options.ConnectionString = Configuration.GetSection("MongoDb:ConnectionString").Value;
                options.Database = Configuration.GetSection("MongoDb:Database").Value;
            });

        services.AddTransient(typeof(IGenericContext<>), typeof(GenericContext<>));
        services.AddTransient(typeof(IGenericRepository<>), typeof(GenericRepository<>));
    }

Мой общий класс контекста:

public class GenericContext<T> : IGenericContext<T> where T : BaseClass
{
    private readonly IMongoDatabase db;
    public GenericContext(IOptions<Settings> options)
    {
        var client = new MongoClient(options.Value.ConnectionString);
        db = client.GetDatabase(options.Value.Database);
    }

    public IMongoCollection<T> Entities => db.GetCollection<T>("Entities");
}

Мой общий класс репозитория:

public class GenericRepository<T> : IGenericRepository<T> where T : BaseClass
{
    private readonly GenericContext<T> _context;

    public GenericRepository(GenericContext<T> context)
    {
        _context = context;
    }

    public async Task<IEnumerable<T>> GetAll()
    {
        return await _context
                        .Entities
                        .Find(_ => true)
                        .ToListAsync();
    }

    public Task<T> GetById(string customerId)
    {
        FilterDefinition<T> filter = Builders<T>.Filter.Eq(m => m.EntityId, customerId);

        return _context
                .Entities
                .Find(filter)
                .FirstOrDefaultAsync();
    }

    public async Task Create(T customer)
    {
        await _context.Entities.InsertOneAsync(customer);
    }

    public async Task<bool> Update(T customer)
    {
        ReplaceOneResult updateResult =
            await _context
                    .Entities
                    .ReplaceOneAsync(
                        filter: g => g.Id == customer.Id,
                        replacement: customer);

        return updateResult.IsAcknowledged
                && updateResult.ModifiedCount > 0;
    }

    public async Task<bool> Delete(string entityId)
    {
        FilterDefinition<T> filter = Builders<T>.Filter.Eq(m => m.EntityId, entityId);

        DeleteResult deleteResult = await _context
                                            .Entities
                                            .DeleteOneAsync(filter);

        return deleteResult.IsAcknowledged
            && deleteResult.DeletedCount > 0;
    }
}

Мой базовый класс:

public class BaseClass
{
    [BsonId]
    public ObjectId Id { get; set; }
    [BsonElement]
    public string EntityId { get; set; }
}

И мой производный класс Customer:

public class Customer : BaseClass
{
    [BsonElement]
    public string CustomerName { get; set; }
}

Есть ли у вас какие-либо идеи, почему мой общий репозиторий не может быть создан?Кажется, это проблема GenericContext, но я не вижу, где.

Спасибо

1 Ответ

0 голосов
/ 19 мая 2018

Я обнаружил проблему в моем общем хранилище, в которое я вставлял класс вместо интерфейса:

public GenericRepository(GenericContext<T> context)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...