클래스 라이브러리에 클래스를 설정하고 Startup.cs의 서비스에서이를 주입 가능하도록 설정하여 문제없이 작동하도록했습니다. 예상했다. 내가하고 있어요 테스트 응용 프로그램에서 클래스 라이브러리 프로젝트에 주입 가능한 Asp.Net Core 2.0의 Configuration 객체
. 나는
// *If* you need access to generic IConfiguration this is **required**
services.AddSingleton<IConfiguration>(Configuration);
services.AddOptions();
// Add our class objects so they can be injected
services.Configure<TestAppServices.ConfigurationClasses.ApplicationSettings>(Configuration.GetSection("ApplicationSettings"));
services.Configure<TestAppServices.ConfigurationClasses.LoggingSettings>(Configuration.GetSection("Logging"));
services.Configure<TestAppServices.ConfigurationClasses.ApplicationIconUrlSettings>(Configuration.GetSection("ApplicationIconUrls"));
services.Configure<TestAppServices.ConfigurationClasses.DatabaseConfigurationSettings>(Configuration.GetSection("ConnectionStrings"));
services.Configure<TestAppServices.ConfigurationClasses.SmsSettings>(Configuration.GetSection("SmsSettings"));
Startup.cs
에서 데이터 클래스 라이브러리 프로젝트 플러스 내 MVC 응용 프로그램 프로젝트 (코어 2.0.1 EF 2.0.1 MVC6)가
설정 한 개별 클래스의 모든 설정에 액세스 할 수 있지만 다음은 작동하지 않습니다.
private static IConfiguration _configuration { get; set; }
private const string AppSettingsConnectionsHeader = "ConnectionStrings";
public DatabaseHelpers(IConfiguration configuration)
{
_configuration = configuration;
}
public static ConnectionStrings GetConnections()
{
var cs = new ConnectionStrings();
_configuration.GetSection(AppSettingsConnectionsHeader).Bind(cs);
return cs;
}
나는 일반적인 오류를 얻고있다
System.NullReferenceException : 개체 참조가 개체의 인스턴스로 설정되지 않았습니다.
_configuration이 null이므로 주입되지 않습니다.
GetConnections 방법
은 클래스 라이브러리 프로젝트의 주 사용하므로 실제 구성 객체를 설정하는 특별한 방법이 있나요 그래서var cs = DatabaseHelpers.GetConnections();
같은 컨트롤러에서 호출되는?
업데이트 : 나는 다음과 같은
public static class ConnectionStrings
{
public static string DefaultConnection => "DefaultConnection";
public static string TestingConnection => "TestingConnection";
public static string StagingConnection => "StagingConnection";
public static string ProductionConnection => "ProductionConnection";
public static string DevelopmentConnection => "DevelopmentConnection";
}
public class ConfigurationSettings
{
private readonly IConfiguration _configuration;
public ConfigurationSettings(IConfiguration config)
{
_configuration = config;
}
public DatabaseConfigurationSettings GetConnectionStringFor(DatabaseIsFor dbfor)
{
var dbcs = new DatabaseConfigurationSettings();
switch (dbfor)
{
case DatabaseIsFor.Development:
if (!string.IsNullOrEmpty(_configuration.GetConnectionString(ConnectionStrings.DevelopmentConnection)))
{
dbcs.CompleteConnectionString = _configuration.GetConnectionString(ConnectionStrings.DevelopmentConnection);
dbcs.ConnectionName = ConnectionStrings.DevelopmentConnection; //== _connections.Value.DevelopmentConnection.ToString();
return dbcs;
}
break;
case DatabaseIsFor.Testing:
if (!string.IsNullOrEmpty(_configuration.GetConnectionString(ConnectionStrings.TestingConnection)))
{
dbcs.CompleteConnectionString = _configuration.GetConnectionString(ConnectionStrings.TestingConnection);
dbcs.ConnectionName = ConnectionStrings.TestingConnection; //== _connections.Value.TestingConnection.ToString();
return dbcs;
}
break;
case DatabaseIsFor.Staging:
if (!string.IsNullOrEmpty(_configuration.GetConnectionString(ConnectionStrings.StagingConnection)))
{
dbcs.CompleteConnectionString = _configuration.GetConnectionString(ConnectionStrings.StagingConnection);
dbcs.ConnectionName = ConnectionStrings.StagingConnection; //== _connections.Value.TestingConnection.ToString();
return dbcs;
}
break;
case DatabaseIsFor.Production:
if (!string.IsNullOrEmpty(_configuration.GetConnectionString(ConnectionStrings.ProductionConnection)))
{
dbcs.CompleteConnectionString = _configuration.GetConnectionString(ConnectionStrings.ProductionConnection);
dbcs.ConnectionName = ConnectionStrings.ProductionConnection; //== _connections.Value.TestingConnection.ToString();
return dbcs;
}
break;
}
dbcs.CompleteConnectionString = _configuration.GetConnectionString(ConnectionStrings.DefaultConnection);
dbcs.ConnectionName = ConnectionStrings.DefaultConnection; //== _connections.Value.DefaultConnection.ToString();
return dbcs;
}
}
그리고
public class HomeController : Controller
{
private IConfiguration Configuration { get; set; }
public HomeController(IConfiguration configuration)
{
Configuration = configuration;
}
public IActionResult Index()
{
// test view to check that this works
var cs = new ConfigurationSettings(Configuration);
var dbcs = cs.GetConnectionStringFor(DatabaseIsFor.Production);
var svm = SettingsViewModel(dbcs);
return View(svm);
}
}
그리고 작동을 다음과 같이 내가 컨트롤러에서 사용 내 클래스 라이브러리 프로젝트를 재구성 serpent5의 대답은 당
완벽하게 괜찮습니다, 을 제외하고 나는 왜 내가 파해야했는지 이해하지 못합니다. ss ConfigurationSettings를 새로 만들 때의 구성. Startup.cs ConfigureServices에 추가 한 이후로 이미 해당 버전을 사용할 수 있습니까?
// Access to generic IConfiguration
services.AddSingleton(Configuration);
생성자에 중단 점을 넣습니다. 맞았나요? –
@ serpent5 ... 위대한 호출, 생성자의 중단 점이 충돌하지 않습니다, 왜? – dinotom
@ serpent5 ... 주사 구문이 잘못 되었나요? 어떻게 든 IOptions를 구성 루트에 사용합니까 아니면 구성에서 클래스 설정을위한 IOptions입니까? – dinotom