Библиотека обеспечивает простой подход к шаблону единиц работы MongoDB.
Я хочу использовать поддержку ведения журнала драйвера MongoDB для регистрации запросов.Библиотека предоставляет метод расширения Services.AddMongoDbContext( для IServiceCollection для добавления MongoDbContext, он принимает MongoClientSettings, для этого требуется ILoggerFactory для настройки ведения журнала.
Проблема в том, что у меня нет ILoggerFactory до сборки приложения и MongoDbContext. добавляется как сервис, его нельзя добавить после сборки приложения.
Эта проблема немного отличается от других вопросов о входе в Program.cs перед сборкой приложения. На этот раз мне понадобится ILoggerFactory для драйвера.
Инструкции по библиотеке:
Использование
Прежде всего, зарегистрируйте зависимости в MSbuilt -В контейнере:
Код: Выделить всё
public class BloggingContext : MongoDbContext
{
public BloggingContext(IMongoClient client, IMongoDatabase database, IMongoDbContextOptions options)
: base(client, database, options)
{ }
}
// Register the DbContext
services.AddMongoDbContext(
connectionString: Configuration.GetValue("MongoSettings:Blogging:ConnectionString"),
databaseName: Configuration.GetValue("MongoSettings:Blogging:DatabaseName"),
setupFluentConfigurationOptions: options => options.ScanningAssemblies = new[] { typeof(BloggingContext).Assembly });
// Register the UnitOfWork
services.AddMongoDbUnitOfWork();
Код: Выделить всё
private readonly IMongoDbUnitOfWork _unitOfWork;
// Injection
public BlogsController(IMongoDbUnitOfWork unitOfWork)
=> _unitOfWork = unitOfWork ?? throw new ArgumentNullException(nameof(unitOfWork), $"{nameof(unitOfWork
public void DeleteBlog()
{
var repository = _unitOfWork.Repository();
repository.DeleteOne(x => x.Id == id);
_unitOfWork.SaveChanges();
}
Program.cs
Код: Выделить всё
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddLogging();
var databaseName = builder.Configuration.GetSection("MongoDB:DatabaseName")?.Get();
var connectionString = builder.Configuration.GetSection("MongoDB:ConnectionString")?.Get();
var databaseSettings = builder
.Configuration.GetSection("MongoDB:DatabaseSettings")
?.Get();
var clientSettings = MongoClientSettings.FromConnectionString(connectionString);
clientSettings.LoggingSettings = new LoggingSettings(
LoggerFactory.Create(loggingBuilder =>
loggingBuilder.AddConfiguration(builder.Configuration.GetSection("Logging"))
.AddConsole()
),
builder.Configuration.GetSection("MongoDB:LoggingMaxDocumentSize").Get()
);
// Register the DbContext
builder.Services.AddMongoDbContext(
clientSettings,
databaseName,
databaseSettings,
fluentConfigurationOptions: new MongoDbFluentConfigurationOptions
{
ScanningAssemblies = [typeof(ThEbookContext).Assembly],
}
);
// Register the UnitOfWork
builder.Services.AddMongoDbUnitOfWork();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.Run();
Код: Выделить всё
public class BloggingContext(
IMongoClient client,
IMongoDatabase database,
IMongoDbContextOptions options
) : MongoDbContext(client, database, options) { }
Код: Выделить всё
public class BlogModel
{
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string? Id { get; set; } = null!
[BsonElement("title")]
[JsonPropertyName("title")]
public string? Title { get; set; } = null!;
[BsonElement("richText")]
[JsonPropertyName("richText")]
public string? Text { get; set; } = null!;
}
Код: Выделить всё
public class BloggingRepository: MongoDbRepository
{
protected readonly IMongoCollection _collection;
protected readonly ILogger _logger;
public BloggingRepository(
BloggingContext context,
IOptions mongoDbSettings,
ILogger logger
)
: base(context)
{
_collection = Context.GetCollection(
mongoDbSettings.Value.CollectionNames[typeof(Blog).Name]
);
_logger = logger;
}
Код: Выделить всё
[Route("")]
[ApiController]
public class HomeController(BloggingRepository repository, ILogger logger) : ControllerBase
{
private readonly BloggingRepository _repository = repository;
private readonly ILogger _logger = logger;
[HttpGet(Name = "HomePage")]
public async Task Get() {
_logger.LogInformation("Get all blogs");
await _repository.FindAllAsync();
}
}
Код: Выделить всё
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Information",
"MongoDB.Command": "Debug",
"MongoDB.*": "Error"
},
"Console": {
"FormatterName": "simple",
"FormatterOptions": {
"TimestampFormat": "HH:mm:ss "
}
}
},
"AllowedHosts": "*",
"MongoDB": {
"ConnectionString": "mongodb+srv://redacted:redacted@cluster0.redacted.mongodb.net/?retryWrites=true&w=majority&appName=Cluster0",
"DatabaseName": "blog",
"ClientSettings": {},
"DatabaseSettings": {},
"LoggingMaxDocumentSize": 100,
"CollectionNames": {
"BlogModel": "blog"
}
}
}
Код: Выделить всё
net8.0
enable
enable
1. Создайте новую LoggerFactory
Код: Выделить всё
var clientSettings = MongoClientSettings.FromConnectionString(connectionString);
clientSettings.LoggingSettings = new LoggingSettings(
LoggerFactory.Create(loggingBuilder =>
loggingBuilder.AddConfiguration(builder.Configuration.GetSection("Logging"))
.AddConsole()
),
builder.Configuration.GetSection("MongoDB:LoggingMaxDocumentSize").Get()
);
- Работает, но не будет никаких настроек builder.Services.AddLogging() по умолчанию
2. Добавьте MongoDbContext вручную
Реализация AddMongoDbContext - Невозможно, есть еще кое-что, что можно сделать в разделе капот и добавляемые им службы помечены как внутренние.
Подробнее здесь: https://stackoverflow.com/questions/791 ... -app-build
Мобильная версия