2011-04-10 15 views
9

Sadece MongoDB (C#) ile oynamaya başladım ve varlık çerçevesinden bir depoyu göndermeye çalıştım. Resmi C# sürücüsü 1.0 kullanıyorum.MongoDB ile Depozit Modeli: Veritabanının nerede başlatılacağı

internal class MongoContext 
{ 
    public MongoContext(string constring) 
    { 
     MongoServer server = MongoServer.Create(constring); 
     this.myDB = server.GetDatabase("MyDB"); 

     BsonClassMap.RegisterClassMap<VoyageNumber>(cm => 
      { cm.MapField<string>(p => p.Id); }); 
     BsonClassMap.RegisterClassMap<Schedule>(cm => 
     { cm.MapField<DateTime>(p => p.EndDate); cm.MapField<DateTime>(p => p.StartDate); }); 
     BsonClassMap.RegisterClassMap<Voyage>(cm => 
      { cm.MapIdField<VoyageNumber>(p => p.VoyageNumber); cm.MapField<Schedule>(p => p.Schedule); }); 

    } 

    private MongoDatabase myDB; 
    public MongoDatabase MyDB 
    { get { return this.myDB; } } 
} 

Sonra gidip böyle depoyu uygulamak istiyorum:

Şimdi
public class MongoVoyageRepository : IVoyageRepository 
{ 
    private readonly MongoContext context; 

    public MongoVoyageRepository(string constring) 
    { 
     this.context = new MongoContext(constring); 
    } 

    public void Store(Domain.Model.Voyages.Voyage voyage) 
    { 

     MongoCollection<Voyage> mongoVoyages = context.MyDB.GetCollection<Voyage>("Voyages"); 

     //store logic... 

    } 

} 

Ben bir örneğini iyi bir karar olup olmadığını bilmek istiyorum Şimdi böyle bir şey yaptılar performans bağlamında bunun gibi "içerik". BsonClass Haritalarını oraya koymak mantıklı mı? Girişiniz için teşekkür ederiz.

cevap

2

Depo sınıfınızı oluştururken, her defasında eşleşme sınıflarını kaydettirmenin anlamlı olmadığını düşünüyorum. MongoDB C# sürücüsü, dahili olarak MongoDB ile bağlantıları yönetdiğinden, uygulama başlangıcı sırasında MongoServer oluşturmak ve sınıfları eşleme işlemini yalnızca bir kez kaydetmeniz ve kullanmanız daha iyi olacaktır. amacıyla

Ben

public class MongoRead : MongoBase 
{ 
    public MongoRead(MongoServer server) 
      : base(server) 
    { 

    } 


    public override MongoDatabase Database 
    { 
    get { return Server.GetDatabase("myDb"); } 
    } 

    public MongoCollection Logs 
    { 
    get { return Database.GetCollection("logs"); } 
    } 

    private static MongoRead _instance = null; 

    public static MongoRead Instance 
    { 
    get 
     { 
     if (_instance == null) 
     { 
      _instance = RegisterMongoDb(); 

     } 

     return _instance; 
     } 

    } 

    private static MongoRead RegisterMongoDb() 
    { 
     var readServer = MongoServer.Create(connectionString); 
     var read = new MongoRead(readServer); 

     var myConventions = new ConventionProfile(); 
     myConventions.SetIdMemberConvention(new NoDefaultPropertyIdConvention()); 
     BsonClassMap.RegisterConventions(myConventions, t => true); 

     return read; 
    } 

} 

Yani siz de depodaki sınıfının üstünde kullanabilirsiniz sadece bir kez MongoServer oluşturmak için singleton kullanıyorum: İsterseniz

public class MongoVoyageRepository : IVoyageRepository 
{ 
    private readonly MongoRead context 
    { 
     get { return MongoRead.Instance; } 
    }; 

    public MongoVoyageRepository() 
    { 
    } 

    public void Store(Domain.Model.Voyages.Voyage voyage) 
    { 
      MongoCollection<Voyage> mongoVoyages = 
        context.Database.GetCollection<Voyage>("Voyages"); 
      //store logic... 
    } 

} 
+0

Bu çalışır, ancak ben Instance özelliğini, bağlantı dizesini depoya (IoC) enjekte etmek istediğim için bir bağlantı dizesini kabul eden bir yönteme dönüştürdüm. – hoetz

+0

@Malkier: Ayrıca IoC adn DI kullanıyordum, 'Instance' yaptık, çünkü pek çok dev IoC, DI hakkında bilgi sahibi değil, ya da hiç de zor değil;) –

+0

@AndrewOrsich 'NoDefaultPropertyIdConvention' sınıfı nedir? –

11
// entity base 
public class MongoEntity { 
    public ObjectId _id { get; set; } 
} 

//user entity 
public class Users : MongoEntity { 
    public string UserName { get; set; } 
    public string Password { get; set; } 
} 


// simple repository 
public class Repository { 

    private MongoDatabase _db; 
    public MongoDatabase Database { get; private set; } 
    public Repository(string constr, string dbname) { 
     var server = MongoServer.Create(constr); 
     _db = server.GetDatabase(dbname); 
     Database = _db; 
    } 

    private MongoCollection<T> GetCollection<T>() where T : MongoEntity { 
     return _db.GetCollection<T>(typeof(T).Name); 
    } 

    public IEnumerable<T> List<T>() where T : MongoEntity { 
     return GetCollection<T>().FindAll(); 
    } 

    public IEnumerable<T> List<T>(Expression<Func<T, bool>> exp) where T : MongoEntity { 
     return GetCollection<T>().AsQueryable<T>().Where(exp); 
    } 

    public T Single<T>(Expression<Func<T, bool>> exp) where T : MongoEntity { 
     return List<T>(exp).SingleOrDefault(); 
    } 

    public void Insert<T>(T entity) where T : MongoEntity { 
     GetCollection<T>().Insert<T>(entity); 
    } 

    public void Insert<T>(ICollection<T> entities) where T : MongoEntity { 
     GetCollection<T>().InsertBatch(entities); 
    } 

    // Update, Delete method etc ... 



} 



// example 
var repository = new Repository("mongodb://localhost", "test"); 
repository.Single<Users>(u => u.UserName == "myUserName"); 
0

this da ilginçtir Havuz kalıbı kullanmak