2017-05-14 63 views
2

到目前爲止,我有我的存儲庫下面的代碼:進樣MongDb與團結depencendy注射

public MyRepo(ILog logger) 
{ 
    this.Logger = logger; 

    var mongoUrlBuilder = new MongoUrlBuilder(ConfigurationManager.ConnectionStrings["MyContext"].ConnectionString); 
    this.MongoClient = new MongoClient(mongoUrlBuilder.ToMongoUrl()); 
    this.MongoDatabase = this.MongoClient.GetDatabase("MyDB"); 
    this.UserCollection = this.MongoDatabase.GetCollection<MyModel>("pro"); 
} 

這就是我如何使用例如統一DI容器:

var container = new UnityContainer(); 

container.RegisterType<IMyModel, MyModel>(); 

RegisterTypes(container); 
return container; 

如何使用統一DI注入MongoDb?

我問的主要原因是因爲我想能夠模擬mongoDb並對其進行測試。這些要求要求我使用Unity DI和MongoDb。

UPDATE

最後,我去下面的百通。我加了Db的上下文類看起來像這樣:

public class MongoDbContext 
    { 
     public const string CONNECTION_STRING_NAME = "DBContext"; 
     public const string DATABASE_NAME = "MyDb"; 

     private static readonly IMongoClient Client; 
     private static readonly IMongoDatabase Database; 

     static MongoDbContext() 
     { 
      var connectionString = ConfigurationManager.ConnectionStrings[CONNECTION_STRING_NAME].ConnectionString; 
      Client = new MongoClient(connectionString); 
      Database = Client.GetDatabase(DATABASE_NAME); 
     } 

     public IMongoCollection<TEntity> GetCollection<TEntity>() 
     { 
      return Database.GetCollection<TEntity>(typeof(TEntity).Name.ToLower() + "s"); 
     } 
    } 

而且MongoRepository內使用它是這樣的:

 public class MyRepository<TModel> : IGenericMongoRepository<TModel> where TModel : BaseModel 
     { 
      private MongoDbContext MongoDbContext = null; 

      public Exception OperationException { get; set; } 
      private ILog Logger; 

      public MyRepository(ILog logger) 
      { 
       this.Logger = logger; 
       this.MongoDbContext = new MongoDbContext(); 
      } 
     public async Task<TModel> Add(TModel item)  
     { 
      try 
      { 
       IMongoCollection<TModel> collection = this.GetCollection<TModel>(); 
       await collection.InsertOneAsync(item); 
       return item; 
      } 
     catch (Exception e) 
     { 
     } 
    } 
} 
+0

wy沒有使用存儲庫模式,並在reposiotory中抽象邏輯 –

+0

@BRAHIMKamel我可以得到一個例子嗎? 「MyRepo」實現了一個接口,我在其他地方使用MyRepo中的這個CRUD邏輯進行注入。 –

+0

那麼,爲什麼你需要注入MongoDb,沒有多大意義AFAK –

回答

1

您可以重構回購採取蒙戈數據庫作爲一種可注射的依賴

private IMongoDatabase database; 
private ILog Logger; 
private IMongoCollection<MyModel> UserCollection; 

public MyRepo(ILog logger, IMongoDatabase database) { 
    this.Logger = logger; 
    this.database = database; 
    this.UserCollection = database.GetCollection<MyModel>("pro"); 
} 

則實例的創建可以被移動到該組合物根

//Create the database instance 
var mongoUrlBuilder = new MongoUrlBuilder(ConfigurationManager.ConnectionStrings["MyContext"].ConnectionString); 
var client = new MongoClient(mongoUrlBuilder.ToMongoUrl()); 
var database = client.GetDatabase("MyDB"); 

var container = new UnityContainer(); 
container.RegisterType<IMyModel, MyModel>(); 
// Register existing object instance 
container.RegisterInstance<IMongoDatabase>(database); 

RegisterTypes(container); 
return container; 
+0

好吧,但我認爲你是有點遠離存儲庫模式的目標 –

+0

@BRAHIMKamel,雖然OP提到一個存儲庫並不意味着他們正在應用存儲庫模式。我只是想證明MongoDb已經提供抽象以允許基於OP需求的注入和可測試性。 – Nkosi

+0

我正在考慮這個選項,但是我認爲所有幫助注入M​​ongoDatabase的組件都不應該屬於統一類,或者以某種方式注入並配置。 –