2013-06-19 2 views
4

저는 mongodb을 처음 사용하고 있으며 새로운 프로젝트를 위해 mvc4 웹 응용 프로그램을 만들고 있습니다.mongodb에 대한 일반적인 저장소를 구현하는 방법은 무엇입니까?

데이터베이스 레벨 통신을 위해 mongodb 컨텍스트와 통신 할 저장소 패턴을 사용하고자합니다.

Entity Framework 4.0에서 사용한 간단한 인터페이스는 다음과 같습니다. 찾기 구성원은 나를 위해 문제가되는 영역입니다. 나는 mongodb 문맥으로 그들과 함께 나아갈 수있는 단서가 없다.

저는 매우 간단합니다.이 모델은 accessId라는 멤버를 제공하는 ImongoEntity에서 Hero 드라이브입니다.

public class Hero : MongoDB.Kennedy.IMongoEntity 
{ 
    public ObjectId _id { get; set; } 
    public string Name { get; set; } 
    public string Alias { get; set; } 
    public string _accessId { get; set;} 
} 

컨텍스트 클래스는 매우 간단하여 IQueryable 속성으로 표현 된 Heros 컬렉션을 볼 수 있습니다.

public class MongoDataConetext: MongoDB.Kennedy.ConcurrentDataContext 
{ 
    public MongoDataConetext(string databaseName, string serverName="localhost") : base(databaseName, serverName) 
    { 
    } 

    public IQueryable<Hero> Heros { 
     get { 
      return base.GetCollection<Hero>().AsQueryable(); 
     } 
    } 
} 

이제 내 저장소에 가장 간단한 방법은 추가하고 성공적으로 컨텍스트를 MongoDB를하고 추가 또는 MongoDB를 삭제 엔티티를 얻을 얘기 제거된다. 그러나 find 메서드는 컴파일러 수준 오류를 제공합니다. 내 도움에 대한 도움이 필요하고 모든 방법을 찾는다. 영웅, 솔루션, 프로젝트, 사용자 및 카테고리와 같은 entires에 대한 리포지토리 클래스가 필요하기 때문에 저는 genrics를 사용하고 있습니다.

public class Repository<T> : IRepository<T> where T : class, IMongoEntity 
{ 
    private readonly MongoDataConetext _ctx; 
    public Repository(MongoDataConetext ctx) 
    { 
     _ctx = ctx; 
    } 
    public void Add(T entity) 
    { 
     _ctx.Save(entity); 


    } 

    public void Remove(T entity) 
    { 
     _ctx.Delete(entity); 
    } 

    public IQueryable<T> Find(System.Linq.Expressions.Expression<Func<T, bool>> predicate) 
    { 
     _ctx.Heros.Where(predicate); 
     //throw new NotImplementedException(); 
    } 

    //public IQueryable<T> FindAll() 
    //{ 
    // throw new NotImplementedException(); 
    //} 
} 

답변

2

컬렉션에 대해 LINQ를 사용하려는 것 같습니다. 저건 완벽 해. Find() 메서드를 작성하는 대신 IQueryable 속성을 노출하면 훨씬 쉽게이 작업을 수행 할 수 있습니다. 이 클래스를 소비 할 때

public class HeroRepository : IRepository<Heros> where T : class, IMongoEntity 
{ 
    // ... 

    public IQueryable<Heros> Heros 
    { 
     get 
     { 
      return _ctx.GetCollection<Heros>().AsQueryable(); 
      // Careful there, doing this from memory, may be a little off... 
     } 
    } 
} 

은 물론, 다음, 바로 수행 : 여기

은 위의 샘플에서 예입니다

var r = new HeroRepository(); 
var heros = r.Heros.Where(r => r.SuperPowerLevel > 20); 
+0

하지만 저장소의 여러 구체적인 클래스를 만들 필요가 이런 식으로 : 그것은 자신의 nuget 패키지로 사용할 수 있습니다. 예를 들어 projectRepository, jobRepository 등. HeroRepository 대신 무언가를 원합니다. 저장소 . 코드를 사용합니다. 리포지토리 은 T에 실제 유형을 제공합니다. 예를 들어 컨트롤러 내부 또는 일부 서비스 클래스에서이를 수행합니다. 'var repo = new Repository ("databasename"); 'repo.Filter (x => x.SuperPowerLevel> 20); ' – najam

+0

저장소 패턴이 MongoDB와 맞지 않습니까? 나는 그것이 관계형 데이터베이스를 위해 더 많이 만들어 졌다고 느낍니다. 특히 몽고에서는 수업이 여러분의 소장품이기 때문에 특히 그렇습니다. –

0

내가 뭔가를 꽤 이전 게시물의 것을 알지만, Github에 구현 된 MongoRepository 프로젝트를 공유하거나 NuGet package

으로 다운로드하십시오. 참고 : MongoDB 저장소를 구현하려고 시도한 문제 중 하나는 MongoDB 드라이버 버전에 따라 다른 동작을했거나 다소 차이가있는 .NET Framework입니다. MongoRepository 프로젝트 (위의 링크에서)는 MongoDB 드라이버 (check MongoDB driver compatibility)의 다른 버전을 사용하는 .net 3.5, 4.0 및 4.5 프레임 워크에 대해 서로 다른 코드 버전을 사용하여이 문제를 해결했으며 매우 유용합니다.

4

당신이 롭 코너리의 및 NBlog 저장 코드 있지만, MongoDB를의 CSHARP 드라이버 2.0 (즉, 비동기)를 사용하여 유사한 구현에 관심이 있다면, 당신은 볼 수 있습니다 :

https://github.com/alexandre-spieser/mongodb-generic-repository

그런 다음 쓸 수 있습니다 BaseMongoRepository로부터 상속받은 커스텀 저장소.

public interface ITestRepository : IBaseMongoRepository 
{ 
    void DropTestCollection<TDocument>(); 
    void DropTestCollection<TDocument>(string partitionKey); 
} 

public class TestRepository : BaseMongoRepository, ITestRepository 
{ 
    public TestRepository(string connectionString, string databaseName) : base(connectionString, databaseName) 
    { 
    } 

    public void DropTestCollection<TDocument>() 
    { 
     MongoDbContext.DropCollection<TDocument>(); 
    } 

    public void DropTestCollection<TDocument>(string partitionKey) 
    { 
     MongoDbContext.DropCollection<TDocument>(partitionKey); 
    } 
} 

업데이트 :

Install-Package MongoDbGenericRepository 
관련 문제