刚刚进入 NoSQL 的东西,如果这是一个简单的问题,请原谅我。我正在尝试使用通用存储库来实现存储库类型模式,以进行更常见的操作。
我遇到的一件事就是扼杀这个想法是,为了获得您计划使用的集合,您必须为集合的名称传递一个字符串值。
var collection = database.GetCollection<Entity>("entities");
这意味着我必须硬编码我的集合名称或在某处编写字典以充当查找,以便我可以将对象类型映射到集合名称。
其他人是如何处理这个问题的?
刚刚进入 NoSQL 的东西,如果这是一个简单的问题,请原谅我。我正在尝试使用通用存储库来实现存储库类型模式,以进行更常见的操作。
我遇到的一件事就是扼杀这个想法是,为了获得您计划使用的集合,您必须为集合的名称传递一个字符串值。
var collection = database.GetCollection<Entity>("entities");
这意味着我必须硬编码我的集合名称或在某处编写字典以充当查找,以便我可以将对象类型映射到集合名称。
其他人是如何处理这个问题的?
我写了一个类来管理数据库事务
首先,您需要所有实体的基类:
public abstract class Entity
{
public ObjectId Id { set; get; }
}
然后是一个静态类来管理所有:
public static class MongoDB
{
private static string connectionString = "mongodb://localhost";
public static string DatabaseName { get { return "test"; } }
private static MongoServer _server;
private static MongoDatabase _database;
public static MongoServer Server
{
get
{
if (_server == null)
{
var client = new MongoClient(connectionString);
_server = client.GetServer();
}
return _server;
}
}
public static MongoDatabase DB
{
get
{
if(_database == null)
_database = Server.GetDatabase(MongoDB.DatabaseName);
return _database;
}
}
public static MongoCollection<T> GetCollection<T>() where T : Entity
{
return DB.GetCollection<T>(typeof(T).FullName);
}
public static List<T> GetEntityList<T>() where T : Entity
{
var collection = MongoDB.DB.GetCollection<T>(typeof(T).FullName);
return collection.FindAll().ToList<T>();
}
public static void InsertEntity<T>(T entity) where T : Entity
{
GetCollection<T>().Save(entity);
}
}
然后像这样使用它:
public class SomeEntity : Entity { public string Name {set;get;} }
MongoDB.InsertEntity<SomeEntity>(new SomeEntity(){ Name = "ashkan" });
List<SomeEntity> someEntities = MongoDB.GetEntityList<SomeEntity>();
你可以做的是“半硬编码”。您可以将集合的名称放在类名中并引用它:
public class Entity {
public static readonly string Name = "entities";
}
var collection = database.GetCollection<Entity>(Entity.Name);
我终于找到了一种对我非常有用的方法,因为我所有的 mongo 集合都遵循驼峰式下划线命名约定,所以我做了一个简单的字符串扩展来将 POCO 命名约定转换为我的 mongo 约定。
private readonly IMongoDatabase _db;
public IMongoCollection<TCollection> GetCollection<TCollection>() =>
_db.GetCollection<TCollection>(typeof(TCollection).ToString().MongifyToCollection());
此方法位于使用依赖注入处理 mongo 的类中,它还包装了默认的 GetCollection 以使其更加面向对象
public class MongoContext : IMongoContext
{
private readonly IMongoDatabase _db;
public MongoContext()
{
var connectionString = MongoUrl.Create(ConfigurationManager.ConnectionStrings["mongo"].ConnectionString);
var client = new MongoClient(connectionString);
_db = client.GetDatabase(connectionString.DatabaseName);
RegisterConventions();
}
public IMongoCollection<TCollection> GetCollection<TCollection>() =>
_db.GetCollection<TCollection>(typeof(TCollection).Name.MongifyToCollection());
...
和扩展:
// It may require some improvements, but enough simple for my needs at the moment
public static string MongifyToCollection(this string source)
{
var result = source.Mongify().Pluralize(); //simple extension to replace upper letters to lower, etc
return result;
}