Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion global.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"sdk": {
"version": "8.0.402",
"version": "8.0.117",
"rollForward": "latestFeature"
}
}
124 changes: 124 additions & 0 deletions src/Context.Tests/MongoDbContextTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,110 @@ public void Constructor_MongoOptions_CanAccessWhenNotInitialize()

#endregion

#region IMongoClient Constructor Tests

[Fact]
public void Constructor_WithIMongoClient_AutoInitialize_InitializationExecuted()
{
// Arrange
var mongoClient = new MongoClient(_mongoOptions.ConnectionString);
var databaseName = _mongoDatabase.DatabaseNamespace.DatabaseName;

// Act
var testMongoDbContext = new TestMongoDbContextWithClient(mongoClient, databaseName);

// Assert
Assert.True(testMongoDbContext.IsInitialized);
Assert.Equal(mongoClient, testMongoDbContext.Client);
Assert.Equal(databaseName, testMongoDbContext.Database.DatabaseNamespace.DatabaseName);
}

[Fact]
public void Constructor_WithIMongoClient_NoInitialize_InitializationNotExecuted()
{
// Arrange
var mongoClient = new MongoClient(_mongoOptions.ConnectionString);
var databaseName = _mongoDatabase.DatabaseNamespace.DatabaseName;

// Act
var testMongoDbContext = new TestMongoDbContextWithClient(mongoClient, databaseName, false);

// Assert
Assert.False(testMongoDbContext.IsInitialized);
}

[Fact]
public void Constructor_WithIMongoClient_NullClient_ThrowsArgumentNullException()
{
// Arrange
IMongoClient mongoClient = null!;
var databaseName = _mongoDatabase.DatabaseNamespace.DatabaseName;

// Act & Assert
Assert.Throws<ArgumentNullException>(() => new TestMongoDbContextWithClient(mongoClient, databaseName));
}

[Fact]
public void Constructor_WithIMongoClient_NullDatabaseName_ThrowsArgumentNullException()
{
// Arrange
var mongoClient = new MongoClient(_mongoOptions.ConnectionString);
string databaseName = null!;

// Act & Assert
Assert.Throws<ArgumentNullException>(() => new TestMongoDbContextWithClient(mongoClient, databaseName));
}

[Fact]
public void Constructor_WithIMongoClient_Database_AccessibleAfterInitialize()
{
// Arrange
var mongoClient = new MongoClient(_mongoOptions.ConnectionString);
var databaseName = _mongoDatabase.DatabaseNamespace.DatabaseName;
var testMongoDbContext = new TestMongoDbContextWithClient(mongoClient, databaseName, false);

// Act
testMongoDbContext.Initialize();

// Assert
Assert.NotNull(testMongoDbContext.Database);
Assert.Equal(databaseName, testMongoDbContext.Database.DatabaseNamespace.DatabaseName);
}

[Fact]
public void Constructor_WithIMongoClient_CreateCollection_WorksAfterInitialize()
{
// Arrange
var mongoClient = new MongoClient(_mongoOptions.ConnectionString);
var databaseName = _mongoDatabase.DatabaseNamespace.DatabaseName;
var testMongoDbContext = new TestMongoDbContextWithClient(mongoClient, databaseName, false);

// Act
testMongoDbContext.Initialize();
var collection = testMongoDbContext.CreateCollection<BsonDocument>();

// Assert
Assert.NotNull(collection);
}

[Fact]
public void Constructor_WithIMongoClient_MongoOptions_IsConfiguredCorrectly()
{
// Arrange
var mongoClient = new MongoClient(_mongoOptions.ConnectionString);
var databaseName = _mongoDatabase.DatabaseNamespace.DatabaseName;

// Act
var testMongoDbContext = new TestMongoDbContextWithClient(mongoClient, databaseName);

// Assert
Assert.NotNull(testMongoDbContext.MongoOptions);
Assert.Equal(databaseName, testMongoDbContext.MongoOptions.DatabaseName);
Assert.Equal("", testMongoDbContext.MongoOptions.ConnectionString); // Empty for IMongoClient path
}

#endregion

#region Private Helpers

private class TestMongoDbContext : MongoDbContext
Expand All @@ -119,6 +223,26 @@ protected override void OnConfiguring(IMongoDatabaseBuilder mongoDatabaseBuilder
public bool IsInitialized { get; private set; }
}

private class TestMongoDbContextWithClient : MongoDbContext
{
public TestMongoDbContextWithClient(IMongoClient mongoClient, string databaseName)
: base(mongoClient, databaseName)
{
}

public TestMongoDbContextWithClient(IMongoClient mongoClient, string databaseName, bool enableAutoInit)
: base(mongoClient, databaseName, enableAutoInit)
{
}

protected override void OnConfiguring(IMongoDatabaseBuilder mongoDatabaseBuilder)
{
IsInitialized = true;
}

public bool IsInitialized { get; private set; }
}

#endregion
}
}
79 changes: 61 additions & 18 deletions src/Context/Internal/MongoDatabaseBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,9 @@ namespace MongoDB.Extensions.Context;

internal class MongoDatabaseBuilder : IMongoDatabaseBuilder
{
private readonly MongoOptions _mongoOptions;
private readonly MongoOptions? _mongoOptions;
private readonly IMongoClient? _existingMongoClient;
private readonly string? _databaseName;
private readonly List<Action> _registrationConventionActions;
private readonly List<Action> _registrationSerializerActions;
private readonly List<Action<MongoClientSettings>> _mongoClientSettingsActions;
Expand All @@ -34,6 +36,20 @@ static MongoDatabaseBuilder()
public MongoDatabaseBuilder(MongoOptions mongoOptions)
{
_mongoOptions = mongoOptions;
_existingMongoClient = null;
_databaseName = null;
_registrationConventionActions = new List<Action>();
_registrationSerializerActions = new List<Action>();
_mongoClientSettingsActions = new List<Action<MongoClientSettings>>();
_databaseConfigurationActions = new List<Action<IMongoDatabase>>();
_collectionActions = new List<Action<IMongoDatabase, IMongoCollections>>();
}

public MongoDatabaseBuilder(IMongoClient mongoClient, string databaseName)
{
_mongoOptions = null;
_existingMongoClient = mongoClient;
_databaseName = databaseName;
_registrationConventionActions = new List<Action>();
_registrationSerializerActions = new List<Action>();
_mongoClientSettingsActions = new List<Action<MongoClientSettings>>();
Expand All @@ -44,13 +60,27 @@ public MongoDatabaseBuilder(MongoOptions mongoOptions)
public IMongoDatabaseBuilder ConfigureConnection(
Action<MongoClientSettings> mongoClientSettingsAction)
{
if (_existingMongoClient != null)
{
// When using an existing IMongoClient, we cannot modify its settings
// This configuration will be ignored
return this;
}

_mongoClientSettingsActions.Add(mongoClientSettingsAction);
return this;
}

public IMongoDatabaseBuilder ConfigureClientSettings(
Action<MongoClientSettings> mongoClientSettingsAction)
{
if (_existingMongoClient != null)
{
// When using an existing IMongoClient, we cannot modify its settings
// This configuration will be ignored
return this;
}

_mongoClientSettingsActions.Add(mongoClientSettingsAction);
return this;
}
Expand Down Expand Up @@ -196,24 +226,37 @@ internal MongoDbContextData Build()
TryRegisterObjectSerializer();
}

// create mongo client settings
var mongoClientSettings = MongoClientSettings
.FromConnectionString(_mongoOptions.ConnectionString);

// set default mongo client settings
mongoClientSettings = SetDefaultClientSettings(
mongoClientSettings);

// set specific mongo client settings
_mongoClientSettingsActions.ForEach(
settings => settings(mongoClientSettings));

// create mongo client
var mongoClient = new MongoClient(mongoClientSettings);
IMongoClient mongoClient;
IMongoDatabase mongoDatabase;

// create mongo database
IMongoDatabase mongoDatabase = mongoClient
.GetDatabase(_mongoOptions.DatabaseName);
if (_existingMongoClient != null)
{
// Use existing client path
mongoClient = _existingMongoClient;
mongoDatabase = mongoClient.GetDatabase(_databaseName!);
}
else
{
// Original MongoOptions path
// create mongo client settings
var mongoClientSettings = MongoClientSettings
.FromConnectionString(_mongoOptions!.ConnectionString);

// set default mongo client settings
mongoClientSettings = SetDefaultClientSettings(
mongoClientSettings);

// set specific mongo client settings
_mongoClientSettingsActions.ForEach(
settings => settings(mongoClientSettings));

// create mongo client
mongoClient = new MongoClient(mongoClientSettings);

// create mongo database
mongoDatabase = mongoClient
.GetDatabase(_mongoOptions.DatabaseName);
}

// configure mongo database
_databaseConfigurationActions.ForEach(
Expand Down
39 changes: 38 additions & 1 deletion src/Context/MongoDbContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,34 @@ public MongoDbContext(MongoOptions mongoOptions, bool enableAutoInitialize)
Initialize();
}
}

public MongoDbContext(IMongoClient mongoClient, string databaseName) : this(mongoClient, databaseName, true)
{
}

public MongoDbContext(IMongoClient mongoClient, string databaseName, bool enableAutoInitialize)
{
// Create a minimal MongoOptions for interface compliance
MongoOptions = new MongoOptions
{
ConnectionString = "", // Not used when client is provided
DatabaseName = databaseName
};

MongoClient = mongoClient ?? throw new ArgumentNullException(nameof(mongoClient));
DatabaseName = databaseName ?? throw new ArgumentNullException(nameof(databaseName));

if (enableAutoInitialize)
{
Initialize();
}
}

public MongoOptions MongoOptions { get; }

protected IMongoClient? MongoClient { get; }
protected string? DatabaseName { get; }

public IMongoClient Client
{
get
Expand Down Expand Up @@ -61,7 +87,18 @@ public virtual void Initialize()
{
if (_mongoDbContextData == null)
{
var mongoDatabaseBuilder = new MongoDatabaseBuilder(MongoOptions);
MongoDatabaseBuilder mongoDatabaseBuilder;

if (MongoClient != null && DatabaseName != null)
{
// Use existing IMongoClient path
mongoDatabaseBuilder = new MongoDatabaseBuilder(MongoClient, DatabaseName);
}
else
{
// Use MongoOptions path
mongoDatabaseBuilder = new MongoDatabaseBuilder(MongoOptions);
}

OnConfiguring(mongoDatabaseBuilder);

Expand Down