4

刚刚进入 NoSQL 的东西,如果这是一个简单的问题,请原谅我。我正在尝试使用通用存储库来实现存储库类型模式,以进行更常见的操作。

我遇到的一件事就是扼杀这个想法是,为了获得您计划使用的集合,您必须为集合的名称传递一个字符串值。

var collection = database.GetCollection<Entity>("entities");

这意味着我必须硬编码我的集合名称或在某处编写字典以充当查找,以便我可以将对象类型映射到集合名称。

其他人是如何处理这个问题的?

4

3 回答 3

7

我写了一个类来管理数据库事务

首先,您需要所有实体的基类:

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>();
于 2013-10-12T07:24:03.860 回答
6

你可以做的是“半硬编码”。您可以将集合的名称放在类名中并引用它:

public class Entity {
  public static readonly string Name = "entities";
}

var collection = database.GetCollection<Entity>(Entity.Name);
于 2012-06-30T23:13:55.697 回答
2

我终于找到了一种对我非常有用的方法,因为我所有的 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;
    }
于 2015-08-24T09:31:34.167 回答