Simple repository pattern for Cosmos DB
Use NuGet to install the package.
PM> Install-Package DocumentDB.Repository
Before you can play with your DocumentDB database you need to get the DocumentDB Client by passing your endopointUrl and authorizationKey (primary).
internal class Program
{
public static IReliableReadWriteDocumentClient Client { get; set; }
private static void Main(string[] args)
{
IDocumentDbInitializer init = new DocumentDbInitializer();
string endpointUrl = ConfigurationManager.AppSettings["azure.documentdb.endpointUrl"];
string authorizationKey = ConfigurationManager.AppSettings["azure.documentdb.authorizationKey"];
// get the Azure DocumentDB client
Client = init.GetClient(endpointUrl, authorizationKey);
// Run demo
Task t = MainAsync(args);
t.Wait();
}
}
With the client in place create a repository providing database id (will be created if it doesn't exist). Now it's really easy to do the CRUD operations:
private static async Task MainAsync(string[] args)
{
string databaseId = ConfigurationManager.AppSettings["azure.documentdb.databaseId"];
// create repository for persons
DocumentDbRepository<Person> repo = new DocumentDbRepository<Person>(Client, databaseId);
// create a new person
Person matt = new Person
{
FirstName = "m4tt",
LastName = "TBA",
BirthDayDateTime = new DateTime(1990, 10, 10),
PhoneNumbers =
new Collection<PhoneNumber>
{
new PhoneNumber {Number = "555", Type = "Mobile"},
new PhoneNumber {Number = "777", Type = "Landline"}
}
};
// add person to database's collection (if collection doesn't exist it will be created and named as class name -it's a convenction, that can be configured during initialization of the repository)
matt = await repo.AddOrUpdateAsync(matt);
// create another person
Person jack = new Person
{
FirstName = "Jack",
LastName = "Smith",
BirthDayDateTime = new DateTime(1990, 10, 10),
PhoneNumbers = new Collection<PhoneNumber>()
};
// add jack to collection
jack = await repo.AddOrUpdateAsync(jack);
// update first name
matt.FirstName = "Matt";
// add last name
matt.LastName = "Smith";
// remove landline phone number
matt.PhoneNumbers.RemoveAt(1);
// should update person
await repo.AddOrUpdateAsync(matt);
// get Matt by his Id
Person justMatt = await repo.GetByIdAsync(matt.Id);
// ... or by his first name
Person firstMatt = await repo.FirstOrDefaultAsync(p => p.FirstName.Equals("matt", StringComparison.OrdinalIgnoreCase));
// query all the smiths
var smiths = (await repo.WhereAsync(p => p.LastName.Equals("Smith", StringComparison.OrdinalIgnoreCase))).ToList();
// count all persons
var personsCount = await repo.CountAsync();
// count all jacks
var jacksCount = await repo.CountAsync(p => p.FirstName == "Jack");
// remove matt from collection
await repo.RemoveAsync(matt.Id);
// remove jack from collection
await repo.RemoveAsync(jack.Id);
}
Full example can be found here.
cosmosdb-repo is provided under the MIT license.