У меня есть две сущности
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 для этих моделей, и большая часть реализации имеет ту же проблему