MongoDB C#驱动程序database.GetCollection和魔术字符串

JBe*_*ton 3 mongodb mongodb-.net-driver

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

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

var collection = database.GetCollection<Entity>("entities");
Run Code Online (Sandbox Code Playgroud)

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

别人怎么处理这个?

Ash*_*rat 6

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

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

public abstract class Entity
{
    public ObjectId Id { set; get; }
}
Run Code Online (Sandbox Code Playgroud)

然后是一个静态类来管理所有:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它:

 public class SomeEntity : Entity { public string Name {set;get;} }

 MongoDB.InsertEntity<SomeEntity>(new SomeEntity(){ Name = "ashkan" });

 List<SomeEntity> someEntities = MongoDB.GetEntityList<SomeEntity>();
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的解决方案。我已经实现了类似的方法,但是我的方法在依赖注入中也表现良好。我为每个数据库都有一个包装器类(PrimaryMongoDb,StatsMongoDb),然后向DI容器注册每个包装的实例。因此,任何要求PrimaryMongoDb的类都将获得一个实例,然后可以获取诸如instanceInstancePrimaryDb.GetCollection &lt;SomeType&gt;();之类的任何集合。另外,可以使用接口来代替抽象类。我使用IAggregateRoot,它仅具有一个ID。 (2认同)

Ste*_*Luu 5

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

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

var collection = database.GetCollection<Entity>(Entity.Name);
Run Code Online (Sandbox Code Playgroud)