Compare commits
6 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| e91c89f054 | |||
| 657beeac99 | |||
| fbb07475a1 | |||
| 30ea910b9c | |||
| aae71cddc3 | |||
| ad2cd66a7d |
@@ -5,11 +5,13 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.AspNetCore.Identity" Version="2.0.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Identity.Stores" Version="2.0.0" />
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.5.0-preview-20170810-02" />
|
||||
<PackageReference Include="MongoDB.Driver" Version="2.4.4" />
|
||||
<PackageReference Include="xunit" Version="2.3.0-beta5-build3769" />
|
||||
<PackageReference Include="xunit.runner.console" Version="2.3.0-beta5-build3769" />
|
||||
<PackageReference Include="xunit.runner.visualstudio" Version="2.3.0-beta5-build3769" />
|
||||
<PackageReference Include="xunit" Version="2.3.0" />
|
||||
<PackageReference Include="xunit.runner.console" Version="2.3.0" />
|
||||
<PackageReference Include="xunit.runner.visualstudio" Version="2.3.0" />
|
||||
<DotNetCliToolReference Include="dotnet-xunit" Version="2.3.0-beta4-build3742" />
|
||||
</ItemGroup>
|
||||
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
using IntegrationTests.Infrastructure;
|
||||
using CoreIntegrationTests.Infrastructure;
|
||||
using MongoDbGenericRepository.Models;
|
||||
using Xunit;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace IntegrationTests
|
||||
namespace CoreIntegrationTests
|
||||
{
|
||||
public class CreateTestsPartitionedDocument : PartitionedDocument
|
||||
{
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
using IntegrationTests.Infrastructure;
|
||||
using CoreIntegrationTests.Infrastructure;
|
||||
using MongoDbGenericRepository.Models;
|
||||
using Xunit;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace IntegrationTests
|
||||
namespace CoreIntegrationTests
|
||||
{
|
||||
public class CreateTestsDocument : Document
|
||||
{
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
using IntegrationTests.Infrastructure;
|
||||
using CoreIntegrationTests.Infrastructure;
|
||||
using MongoDbGenericRepository.Models;
|
||||
using Xunit;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace IntegrationTests
|
||||
namespace CoreIntegrationTests
|
||||
{
|
||||
public class DeleteTestsPartitionedDocument : PartitionedDocument
|
||||
{
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
using IntegrationTests.Infrastructure;
|
||||
using CoreIntegrationTests.Infrastructure;
|
||||
using MongoDbGenericRepository.Models;
|
||||
using Xunit;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace IntegrationTests
|
||||
namespace CoreIntegrationTests
|
||||
{
|
||||
public class DeleteTestsDocument : Document
|
||||
{
|
||||
|
||||
@@ -0,0 +1,77 @@
|
||||
using CoreIntegrationTests.Infrastructure;
|
||||
using MongoDbGenericRepository.Models;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Xunit;
|
||||
using Microsoft.AspNetCore.Identity;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace CoreCoreIntegrationTests
|
||||
{
|
||||
public class MongoIdentityUser<TKey> : IdentityUser<TKey>, IDocument<TKey>
|
||||
where TKey : IEquatable<TKey>
|
||||
{
|
||||
public int Version { get; set; }
|
||||
}
|
||||
|
||||
public class IdentityUserTest : MongoIdentityUser<Guid>, IDocument<Guid>
|
||||
{
|
||||
public IdentityUserTest()
|
||||
{
|
||||
Id = Guid.NewGuid();
|
||||
Version = 2;
|
||||
}
|
||||
public string SomeContent { get; set; }
|
||||
}
|
||||
|
||||
public class IdentityUserTests : BaseMongoDbRepositoryTests<IdentityUserTest>
|
||||
{
|
||||
[Fact]
|
||||
public void AddOne()
|
||||
{
|
||||
// Arrange
|
||||
var document = new IdentityUserTest();
|
||||
// Act
|
||||
SUT.AddOne<IdentityUserTest, Guid>(document);
|
||||
// Assert
|
||||
long count = SUT.Count<IdentityUserTest, Guid>(e => e.Id == document.Id);
|
||||
Assert.Equal(1, count);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task AddOneAsync()
|
||||
{
|
||||
// Arrange
|
||||
var document = new IdentityUserTest();
|
||||
// Act
|
||||
await SUT.AddOneAsync<IdentityUserTest, Guid>(document);
|
||||
// Assert
|
||||
long count = SUT.Count<IdentityUserTest, Guid>(e => e.Id == document.Id);
|
||||
Assert.Equal(1, count);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void AddMany()
|
||||
{
|
||||
// Arrange
|
||||
var documents = new List<IdentityUserTest> { new IdentityUserTest(), new IdentityUserTest() };
|
||||
// Act
|
||||
SUT.AddMany<IdentityUserTest, Guid>(documents);
|
||||
// Assert
|
||||
long count = SUT.Count<IdentityUserTest, Guid>(e => e.Id == documents[0].Id || e.Id == documents[1].Id);
|
||||
Assert.Equal(2, count);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public async Task AddManyAsync()
|
||||
{
|
||||
// Arrange
|
||||
var documents = new List<IdentityUserTest> { new IdentityUserTest(), new IdentityUserTest() };
|
||||
// Act
|
||||
await SUT.AddManyAsync<IdentityUserTest, Guid>(documents);
|
||||
// Assert
|
||||
long count = SUT.Count<IdentityUserTest, Guid>(e => e.Id == documents[0].Id || e.Id == documents[1].Id);
|
||||
Assert.Equal(2, count);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2,10 +2,10 @@
|
||||
using System.Collections.Generic;
|
||||
using System;
|
||||
|
||||
namespace IntegrationTests.Infrastructure
|
||||
namespace CoreIntegrationTests.Infrastructure
|
||||
{
|
||||
|
||||
public class BaseMongoDbRepositoryTests<T> : IDisposable where T : Document, new()
|
||||
public class BaseMongoDbRepositoryTests<T> : IDisposable where T : new()
|
||||
{
|
||||
public T CreateTestDocument()
|
||||
{
|
||||
@@ -44,6 +44,7 @@ namespace IntegrationTests.Infrastructure
|
||||
|
||||
public void Init()
|
||||
{
|
||||
MongoDbConfig.EnsureConfigured();
|
||||
SUT = TestRepository.Instance;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
using MongoDbGenericRepository;
|
||||
|
||||
namespace IntegrationTests
|
||||
namespace CoreIntegrationTests
|
||||
{
|
||||
public interface ITestRepository : IBaseMongoRepository
|
||||
{
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
using CoreCoreIntegrationTests;
|
||||
using MongoDB.Bson.Serialization;
|
||||
using MongoDB.Bson.Serialization.Conventions;
|
||||
using System.Threading;
|
||||
|
||||
namespace CoreIntegrationTests.Infrastructure
|
||||
{
|
||||
internal static class MongoDbConfig
|
||||
{
|
||||
private static bool _initialized = false;
|
||||
private static object _initializationLock = new object();
|
||||
private static object _initializationTarget;
|
||||
|
||||
public static void EnsureConfigured()
|
||||
{
|
||||
EnsureConfiguredImpl();
|
||||
}
|
||||
|
||||
private static void EnsureConfiguredImpl()
|
||||
{
|
||||
LazyInitializer.EnsureInitialized(ref _initializationTarget, ref _initialized, ref _initializationLock, () =>
|
||||
{
|
||||
Configure();
|
||||
return null;
|
||||
});
|
||||
}
|
||||
|
||||
private static void Configure()
|
||||
{
|
||||
RegisterConventions();
|
||||
}
|
||||
|
||||
private static void RegisterConventions()
|
||||
{
|
||||
var pack = new ConventionPack
|
||||
{
|
||||
new IgnoreIfNullConvention(false),
|
||||
new CamelCaseElementNameConvention(),
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
using MongoDbGenericRepository;
|
||||
|
||||
namespace IntegrationTests.Infrastructure
|
||||
namespace CoreIntegrationTests.Infrastructure
|
||||
{
|
||||
/// <summary>
|
||||
/// A singleton implementation of the TestRepository
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
using IntegrationTests.Infrastructure;
|
||||
using CoreIntegrationTests.Infrastructure;
|
||||
using MongoDbGenericRepository.Models;
|
||||
using Xunit;
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace IntegrationTests
|
||||
namespace CoreIntegrationTests
|
||||
{
|
||||
public class ProjectTestsPartitionedDocument : PartitionedDocument
|
||||
{
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
using IntegrationTests.Infrastructure;
|
||||
using CoreIntegrationTests.Infrastructure;
|
||||
using MongoDbGenericRepository.Models;
|
||||
using Xunit;
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace IntegrationTests
|
||||
namespace CoreIntegrationTests
|
||||
{
|
||||
public class Nested
|
||||
{
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
using IntegrationTests.Infrastructure;
|
||||
using CoreIntegrationTests.Infrastructure;
|
||||
using MongoDbGenericRepository.Models;
|
||||
using Xunit;
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace IntegrationTests
|
||||
namespace CoreIntegrationTests
|
||||
{
|
||||
public class ReadTestsPartitionedDocument : PartitionedDocument
|
||||
{
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
using IntegrationTests.Infrastructure;
|
||||
using CoreIntegrationTests.Infrastructure;
|
||||
using MongoDbGenericRepository.Models;
|
||||
using Xunit;
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace IntegrationTests
|
||||
namespace CoreIntegrationTests
|
||||
{
|
||||
public class ReadTestsDocument : Document
|
||||
{
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
using IntegrationTests.Infrastructure;
|
||||
using CoreIntegrationTests.Infrastructure;
|
||||
using MongoDbGenericRepository.Models;
|
||||
using Xunit;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace IntegrationTests
|
||||
namespace CoreIntegrationTests
|
||||
{
|
||||
public class UpdateTestsPartitionedDocument : PartitionedDocument
|
||||
{
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
using IntegrationTests.Infrastructure;
|
||||
using CoreIntegrationTests.Infrastructure;
|
||||
using MongoDbGenericRepository.Models;
|
||||
using Xunit;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace IntegrationTests
|
||||
namespace CoreIntegrationTests
|
||||
{
|
||||
public class UpdateTestsDocument : Document
|
||||
{
|
||||
|
||||
@@ -900,6 +900,15 @@ namespace MongoDbGenericRepository
|
||||
MongoDbContext = mongoDbContext;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The contructor taking a <see cref="IMongoDatabase"/>.
|
||||
/// </summary>
|
||||
/// <param name="mongoDatabase">A mongodb context implementing <see cref="IMongoDatabase"/></param>
|
||||
protected BaseMongoRepository(IMongoDatabase mongoDatabase)
|
||||
{
|
||||
MongoDbContext = new MongoDbContext(mongoDatabase);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The MongoDbContext
|
||||
/// </summary>
|
||||
@@ -2009,6 +2018,7 @@ namespace MongoDbGenericRepository
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Groups filtered a collection of documents given a grouping criteria,
|
||||
/// and returns a dictionary of listed document groups with keys having the different values of the grouping criteria.
|
||||
/// </summary>
|
||||
|
||||
@@ -53,5 +53,11 @@ namespace MongoDbGenericRepository
|
||||
/// </summary>
|
||||
/// <typeparam name="TDocument"></typeparam>
|
||||
void DropCollection<TDocument>(string partitionKey);
|
||||
|
||||
/// <summary>
|
||||
/// Sets the Guid representation of the MongoDb Driver.
|
||||
/// </summary>
|
||||
/// <param name="guidRepresentation">The new value of the GuidRepresentation</param>
|
||||
void SetGuidRepresentation(MongoDB.Bson.GuidRepresentation guidRepresentation);
|
||||
}
|
||||
}
|
||||
@@ -13,7 +13,6 @@ namespace MongoDbGenericRepository.Models
|
||||
/// The Primary Key, which must be decorated with the [BsonId] attribute
|
||||
/// if you want the MongoDb C# driver to consider it to be the document ID.
|
||||
/// </summary>
|
||||
[BsonId]
|
||||
TKey Id { get; set; }
|
||||
/// <summary>
|
||||
/// A version number, to indicate the version of the schema.
|
||||
@@ -25,7 +24,7 @@ namespace MongoDbGenericRepository.Models
|
||||
/// This class represents a basic document that can be stored in MongoDb.
|
||||
/// Your document must implement this class in order for the MongoDbRepository to handle them.
|
||||
/// </summary>
|
||||
public interface IDocument: IDocument<Guid>
|
||||
public interface IDocument : IDocument<Guid>
|
||||
{
|
||||
}
|
||||
}
|
||||
@@ -25,6 +25,15 @@ namespace MongoDbGenericRepository
|
||||
MongoDefaults.GuidRepresentation = MongoDB.Bson.GuidRepresentation.Standard;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sets the Guid representation of the MongoDb Driver.
|
||||
/// </summary>
|
||||
/// <param name="guidRepresentation">The new value of the GuidRepresentation</param>
|
||||
public void SetGuidRepresentation(MongoDB.Bson.GuidRepresentation guidRepresentation)
|
||||
{
|
||||
MongoDefaults.GuidRepresentation = guidRepresentation;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The constructor of the MongoDbContext, it needs a an object implementing <see cref="IMongoDatabase"/>.
|
||||
/// </summary>
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
|
||||
<Relationship Type="http://schemas.microsoft.com/packaging/2010/07/manifest" Target="/MongoDbGenericRepository.nuspec" Id="Rd7ba7aa97a7d4fb2" />
|
||||
<Relationship Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Target="/package/services/metadata/core-properties/e5080d3094a649a39d247315f4dcd1ba.psmdcp" Id="Rcfffb2818c774b93" />
|
||||
</Relationships>
|
||||
@@ -4,6 +4,8 @@ An example of generic repository implementation using the MongoDB C# Sharp 2.0 d
|
||||
Now available as a nuget package:
|
||||
https://www.nuget.org/packages/MongoDbGenericRepository/
|
||||
|
||||
Covered by 200+ integration tests and counting.
|
||||
|
||||
# Usage examples
|
||||
|
||||
This repository is meant to be inherited from.
|
||||
@@ -44,8 +46,16 @@ The repository can be instantiated like so:
|
||||
ITestRepository testRepository = new TestRepository(connectionString, "MongoDbTests");
|
||||
```
|
||||
|
||||
If you prefer to reuse the same MongoDb database across you application, you can use the `MongoDatabase` from the MongoDb driver implementing the `IMongoDatabase` interface:
|
||||
|
||||
```csharp
|
||||
var client = new MongoClient(connectionString);
|
||||
var mongoDbDatabase = Client.GetDatabase(databaseName);
|
||||
ITestRepository testRepository = new TestRepository(mongoDbDatabase);
|
||||
```
|
||||
|
||||
## Adding documents
|
||||
To add a document, its class must inherit from the `Document` class or implement the `IDocument` interface:
|
||||
To add a document, its class must inherit from the `Document` class, implement the `IDocument` or `IDocument<TKey>` interface:
|
||||
|
||||
```csharp
|
||||
public class MyDocument : Document
|
||||
@@ -58,7 +68,7 @@ To add a document, its class must inherit from the `Document` class or implement
|
||||
}
|
||||
```
|
||||
|
||||
The `IDocument` interface can be seen below:
|
||||
The `IDocument` and `IDocument<TKey>` interfaces can be seen below:
|
||||
|
||||
```csharp
|
||||
/// <summary>
|
||||
@@ -70,7 +80,26 @@ The `IDocument` interface can be seen below:
|
||||
Guid Id { get; set; }
|
||||
int Version { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// This class represents a basic document that can be stored in MongoDb.
|
||||
/// Your document must implement this class in order for the MongoDbRepository to handle them.
|
||||
/// </summary>
|
||||
public interface IDocument<TKey> where TKey : IEquatable<TKey>
|
||||
{
|
||||
/// <summary>
|
||||
/// The Primary Key, which must be decorated with the [BsonId] attribute
|
||||
/// if you want the MongoDb C# driver to consider it to be the document ID.
|
||||
/// </summary>
|
||||
[BsonId]
|
||||
TKey Id { get; set; }
|
||||
/// <summary>
|
||||
/// A version number, to indicate the version of the schema.
|
||||
/// </summary>
|
||||
int Version { get; set; }
|
||||
}
|
||||
```
|
||||
|
||||
## Partitioned collections
|
||||
This repository also allows you to partition your document across multiple collections, this can be useful if you are running a SaaS application and want to keep good performance.
|
||||
|
||||
@@ -104,7 +133,7 @@ Please refer to the IntegrationTests (NET45) and CoreIntegrationTests (netstanda
|
||||
## Donations
|
||||
Feeling like my work is worth a coffee?
|
||||
Donations are welcome and will go towards further development of this project as well as other MongoDb related projects. Use the wallet address below to donate.
|
||||
BTC Donations: 1Qc5ZpNA7g66KEEMcz7MXxwNyyoRyKJJZ
|
||||
BTC Donations: 1FDMWqSK8SHXDGKKp7gyZc4rknynWJ7qbj
|
||||
|
||||
*Thank you for your support and generosity!*
|
||||
|
||||
|
||||
Reference in New Issue
Block a user