Cześć,
w moim testowym projekcie mam sobie 3 klasy:
Program.cs, którego zadaniem jest konfiguracja singletonu:
public static IConfigurationRoot Configuration { get; set; }
static void Main(string[] args)
{
Configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddCommandLine(args)
.Build();
var services = ConfigureServices();
var serviceProvider = services.BuildServiceProvider();
serviceProvider.GetService<App>().Run();
}
private static IServiceCollection ConfigureServices()
{
IServiceCollection services = new ServiceCollection();
var config = LoadConfiguration();
ConnectionString con = new ConnectionString();
Configuration.Bind("ConnectionStrings", con);
services.AddSingleton(config);
services.AddSingleton(con);
services.AddSingleton(Configuration);
// required to run the application
services.AddTransient<App>();
return services;
}
public static IConfiguration LoadConfiguration()
{
var builder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
return builder.Build();
}
App.cs, która odpowiada za komunikacje z Userem (taka główna klasa aplikacji), mam tam taki konstruktor:
public App(IConfiguration config, ConnectionString con)
{
conf = config;
var args = Environment.GetCommandLineArgs();
}
I jest sobie też klasa FileService:
public class FileService : File, IFile
{
private readonly ConnectionString con;
public FileService(ConnectionString c) => con = c;
public void GetFiles()
{
using (var connection = new SqlConnection(con.GetConnectionString()))
{
var procedure = "raporty_pobierz_pliki";
var values = new { KoId = 200 };
var results = connection.Query(procedure, values, commandType: CommandType.StoredProcedure).ToList();
results.ForEach(r => Console.WriteLine($"{r.OrderID} {r.Subtotal}"));
}
}
public void Save()
{
}
}
Być może źle do tego podchodzę i czegoś nie rozumiem, ale chciałbym doprowadzić do sytuacji,w której, w FileService będę miał dane z singletona, którego dodałem tutaj: services.AddSingleton(con);
. W jaki sposób to osiągnąć? Czy poprawnym rozwiązaniem jest przekazanie tego w konstruktorze gdy wywołuję klasę w App.cs new FileService(con).GetFiles();
?
EDIT: Moje pytanie wiąże się też z tym, że chciałbym móc mieć dostęp z dowolnego miejsca aplikacji do drugiego singletonu, który przechowuje argumenty podane podczas uruchomienia aplikacji.