Как обойти дублировать код Mongo / Core API - PullRequest
0 голосов
/ 04 июня 2019

У меня есть две сущности

public class EndUser
{
    public const string CollectionName = "Clients";

    [BsonId]
    [BsonRepresentation(BsonType.ObjectId)]
    public string Id { get; set; }

    [BsonElement("FirstName")]
    public string FirstName { get; set; }

    [BsonElement("LastName")]
    public string LastName { get; set; }
}

public class AppDeveloper : EndUser
{
    [BsonElement("CompanyName")]
    public string CompanyName { get; set; }

    [BsonElement("CompanyAdress")]
    public string CompanyAdress { get; set; }
}

и создайте контекст для Mongo

public class MongoContext
{
    private readonly IMongoDatabase _database = null;

    public MongoContext(IOptions<MongoSettings> _settings)
    {
        var client = new MongoClient(_settings.Value.ConnectionString);
        if (client != null)
            _database = client.GetDatabase(_settings.Value.Database);
    }

    public IMongoCollection<EndUser> Users
    {
        get
        {
            IMongoCollection<EndUser> dbConnection = _database.GetCollection<EndUser>(EndUser.CollectionName);
            return dbConnection;
        }
    }

    public IMongoCollection<AppDeveloper> Developers
    {
        get
        {
            IMongoCollection<AppDeveloper> dbConnection = _database.GetCollection<AppDeveloper>(AppDeveloper.CollectionName);
            return dbConnection;
        }
    }
}

и теперь у меня проблема с дублирующим кодом, например

пользовательская реализация

public class UserRepository : IMainMongoRepository<EndUser>, IClientSearching<EndUser>
{
    private readonly MongoContext mongoContext = null;

    public UserRepository(MongoContext mongoContext)
    {
        this.mongoContext = mongoContext;
    }

    public async Task AddAsync(EndUser user)
    {
        try
        {
            await mongoContext.Users.InsertOneAsync(user);
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

    public async Task<EndUser> GetByIdAsync(string id)
    {
        try
        {
            FilterDefinition<EndUser> filter = Builders<EndUser>.Filter.Eq("Id", id);
            EndUser user = await mongoContext.Users.Find(filter).FirstOrDefaultAsync();
            return user;
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

и реализация разработчика

 public class DeveloperRepository : IMainMongoRepository<AppDeveloper>, IClientSearching<AppDeveloper>
{
    private readonly MongoContext mongoContext = null;

    public DeveloperRepository(MongoContext mongoContext)
    {
        this.mongoContext = mongoContext;
    }

    public async Task AddAsync(AppDeveloper developer)
    {
        try
        {
            await mongoContext.Developers.InsertOneAsync(developer);
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

    public async Task<AppDeveloper> GetByIdAsync(string id)
    {
        try
        {
            FilterDefinition<AppDeveloper> filter = Builders<AppDeveloper>.Filter.Eq("Id", id);
            AppDeveloper developer = await mongoContext.Developers.Find(filter).FirstOrDefaultAsync();
            return developer;
        }
        catch (Exception ex)
        {
            throw ex;
        }

    }

В этом примере у меня та же реализация для разностных моделей. Это плохой способ иметь один и тот же код (сейчас у меня всего две модели, но если я возьму 10), что я не знаю, как исправить, как создать правильный код без дублирования? (модели следует хранить в одной коллекции)

У меня есть CRUD для этих моделей, и большая часть реализации имеет ту же проблему

1 Ответ

1 голос
/ 04 июня 2019

Вы можете сделать это так.

public class MongoContext<T>
{
    private readonly IMongoDatabase _database = null;
    private readonly string _collection = null;

    public MongoContext(IOptions<MongoSettings> _settings, string collection)
    {
        var client = new MongoClient(_settings.Value.ConnectionString);
        if (client != null)
            _database = client.GetDatabase(_settings.Value.Database);
        _collection = collection;
    }

    public IMongoCollection<T> Objects
    {
        get
        {
            IMongoCollection<T> dbConnection = _database.GetCollection<T>(_collection);
            return dbConnection;
        }
    }
}

public class Repository<T> : IMainMongoRepository<T>, IClientSearching<T>
{
    private readonly MongoContext<T> mongoContext = null;

    public Repository(MongoContext<T> mongoContext)
    {
        this.mongoContext = mongoContext;
    }

    public async Task AddAsync(T obj)
    {
        try
        {
            await mongoContext.Objects.InsertOneAsync(obj);
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

    public async Task<T> GetByIdAsync(string id)
    {
        try
        {
            FilterDefinition<T> filter = Builders<T>.Filter.Eq("Id", id);
            T obj = await mongoContext.Objects.Find(filter).FirstOrDefaultAsync();
            return obj;
        }
        catch (Exception ex)
        {
            throw ex;
        }

    }
}
...