using System; using MongoDB.Bson; using MongoDB.Driver; using MongoDB.Driver.Builders; namespace Recipes.ReadModel { public class MongoDbProjectionWriter : IProjectionWriter where T: class { private const string DATABASE_NAME = "Recipes"; private readonly string connectionString; private static MongoCollection _collection; public MongoDbProjectionWriter(string connectionString) { this.connectionString = connectionString; } public void Add(int id, T item) { var collection = GetCollection(); collection.Insert(item); } public void Update(int id, Action update) { var query = Query.EQ("_id", new BsonInt32(id)); var collection = GetCollection(); var existingItem = collection.FindOneAs(query); if (existingItem == null) throw new InvalidOperationException("Item does not exists"); update(existingItem); collection.Save(existingItem); } private MongoCollection GetCollection() { if (_collection == null) { var client = new MongoClient(connectionString); var server = client.GetServer(); var database = server.GetDatabase(DATABASE_NAME); _collection = database.GetCollection(typeof(T).Name); } return _collection; } } }