У меня есть библиотека классов Persistence.EFCore, содержащая этот метод.
public static IServiceCollection AddPersistenceServices(this IServiceCollection services, IConfiguration configuration)
{
services.AddDbContext<SIMContext>(options =>
options.UseSqlServer(configuration.GetConnectionString("ConnectionString")));
services.AddTransient<IUnitOfWork, UnitOfWork>();
return services;
}
и это мой код из Program.cs в проекте winform
public static IConfiguration Configuration { get; }
[STAThread]
static void Main()
{
ApplicationConfiguration.Initialize();
var builder = new HostBuilder()
.ConfigureAppConfiguration((hostContext, builder) =>
{
builder.AddJsonFile("apsettings.json", optional: true, reloadOnChange: true);
})
.ConfigureServices((hostContext, services) =>
{
services.AddScoped<XtraMain>();
services.AddPersistenceServices(Configuration);
services.AddApplicationServices();
services.AddTransient<FrmExpressionOfNeeds>();
services.AddSingleton<IFormFactory, FormFactory>();
});
var host = builder.Build();
using (var serviceScope = host.Services.CreateScope())
{
IServiceProvider services = serviceScope.ServiceProvider;
XtraMain mainform = services.GetRequiredService<XtraMain>();
System.Windows.Forms.Application.Run(mainform);
}
}
Я не могу найти способ установить значение конфигурации.
Конфигурация из IConfiguration должна получить свое значение из
Configuration = builder.Build();
Но в моем случае
services.AddPersistenceServices(Configuration);
было до постройки
Я имею в виду конфигурацию из IConfiguration, которую он должен получить от builder.Build(), но в моем случае services.AddPersistenceServices(Configuration); было до постройки
Вы спрашиваете о настройке конфигурации. Вам не нужно устанавливать в Program. Большинство людей просто редактируют файл конфигурации. Вам нужно изменить: configuration.GetConnectionString("ConnectionString")
см. эту ссылку stackoverflow.com/a/65675178/9608194
Первый параметр в ...ConfigureServices((hostContext, services)=>...
имеет свойство Configuration
. Используйте это так: services.AddPersistenceServices(hostContext.Configuration);
Первым параметром ConfigureService((контекст, сервисы)=>{ ... }) является Хостбилдерконтекст, который дает вам доступ к конфигурации, используя его свойство Конфигурация.
Итак, если у вас есть метод расширения службы, который принимает конфигурацию, вы можете легко передать ему конфигурацию с помощью context.Configuration
.
Пример
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.DependencyInjection;
internal static class Program
{
[STAThread]
static void Main()
{
ApplicationConfiguration.Initialize();
var host = CreateHostBuilder().Build();
Application.Run(host.Services.GetRequiredService<Form1>());
}
static IHostBuilder CreateHostBuilder() =>
Host.CreateDefaultBuilder()
.ConfigureServices((context, services) =>
{
services.AddHelloServices(context.Configuration);
services.AddTransient<Form1>();
});
}
Полезная ссылка, если вы хотите рассмотреть шаблоны опций для своей библиотеки в будущем: Руководство по шаблонам параметров для авторов библиотек .NET
Большое спасибо, все работает, и спасибо за полезную ссылку. Таким образом, я могу прочитать настройки из любого места в моем приложении
Конечно, вы можете поделиться конфигурацией (например, то, что я показал в своем другом ответе). Вы также можете настроить и внедрить Options<Something> в любое место, где вам нужна эта зависимость.
Вы можете редактировать файл конфигурации с помощью блокнота в любом текстовом редакторе.