While coding, a discrepancy surfaced. Normally while coding simple methods or constructors I often utilize the expression body technique. However, when I produce the following:
public class Sample : ISample
{
private readonly IConfigurationRoot configuration;
public Sample(IConfigurationRoot configuration) => this.configuration = configuration;
}
The code appears to be valid, Visual Studio and compile both work. The issue though comes if inside that same class, I go to use the configuration
variable. It produces "A field initializer cannot reference a non static field initializer."
That syntax usage that produced:
var example = configuration.GetSection("Settings:Key").Value;
However, if I leave the snippet above this and modify to a block body. Visual Studio no longer freaks out, why would an expression body cause such a peculiar error? While the block body works correctly with snippet above?
public class Sample : ISample
{
private readonly IConfigurationRoot configuration;
public Sample(IConfigurationRoot configuration)
{
this.configuration = configuration;
}
}
public class ApplicationProvider
{
public IConfigurationRoot Configuration { get; } = CreateConfiguration();
public IServiceProvider BuildProvider()
{
var services = new ServiceCollection();
DependencyRegistration(services);
return services.AddLogging().BuildServiceProvider();
}
private IConfigurationRoot CreateConfiguration() => new ConfigurationBuilder()
.SetBasePath(AppContext.BaseDirectory)
.AddJsonFile("appsettings.json")
.Build();
private void DependencyRegistration(this IServiceCollection services)
{
services.AddSingleton(_ => Configuration);
// All other dependency registration would also go here.
}
}
public static IServiceProvider ServiceProvider { get; } = new ApplicationProvider().BuildProvider();
I would have an interface for class, then instantiate by pulling from the provider.
ISample sample = ServiceProvider.GetServices<ISample>();