Получение Dot. Net Core AppSettings в классе, и я не использую MVC - PullRequest
0 голосов
/ 16 апреля 2020

Много ответов на этот вопрос, если вы используете MVC, но что, если вы не используете MVC? У меня есть класс Student , и в нем есть весь Crud. Я не могу использовать ни один из примеров из-за вызова в классе. Я новичок в Core, но уже некоторое время использую веб-формы и MVC.

Когда я выполняю вызов, как показано для примера:

Student s = new Student();
s.FullName = "Sam";
s.Update;

Я получаю сообщение об ошибке, что необходима IConfiguration или IOptions, в зависимости от того, как я пытаюсь вызвать AppSettings.

Startup.cs

   IConfigurationSection appSetting = Configuration.GetSection("AppSettings");
   services.Configure<AppSettings>(appSetting);

Студенческий класс

   public class Student
     {
         private readonly IOptions<AppSettings> _appSetting;

              public Student(IOptions<AppSettings> appSettings)
              {
                   _appSetting = appSettings;
              }

Где он вызывается в Студенческом классе

public Student GetStudent(Guid StudentGUid)
      {
           var Conn = _appSetting.Value.ApplicationConn;

           using (IDbConnection con = new SqlConnection(Conn))
           {

Где я вызываю класс на page .cs

      Student sa = new Student();
      sa.GetStudent(new Guid("2b583b82-0337-425b-ac73-3830bc20253f"));
      var s = sa.LastName;

Ошибка:

* Нет аргумента, соответствующего необходимому формальному параметру appSetting ...., что имеет смысл. Но это где я go с рельсов, так как я не могу просто ввести значение IOption, потому что оно всегда получается нулевым.

Класс AppSettings

public class AppSettings
     {
          public string ApplicationID { get; set; }
          public string ApplicationUrl { get; set; }
          public string ApplicationConn { get; set; }
     }

JSON Файл

 "Logging": {
      "LogLevel": {
           "Default": "Information",
           "Microsoft": "Warning",
           "Microsoft.Hosting.Lifetime": "Information"
      }
 },
 "AppSettings": {
      "ApplicationID": "Some Guid",
      "ApplicationUrl": "xxxxxx",
      "ApplicationConn": "Connection String"
 },
 "AllowedHosts": "*"

1 Ответ

1 голос
/ 16 апреля 2020

Вы пытаетесь создать экземпляр объекта Student, используя new Student();, но в конструкторе вам требуется IOptions<AppSettings> в качестве аргумента, и это исключение, которое вы получаете. Так что да, он всегда будет иметь нулевое значение, потому что вы его не предоставляете.

Как сказал Ян в своем комментарии, вам следует пересмотреть свой дизайн. Зачем самому Студенту потребуется строка подключения? Вы связываете свой доменный объект с доступом к базе данных. То, что я мог бы предложить, это StudentRepository, и я мог бы кодировать его так:

public interface IStudentRepository
{
   Student GetStudentById(Guid studentId);
}
public class StudentRepository : IStudentRepository 
{
   private readonly IOptions<AppSettings> _appSetting;

   public StudentRepository (IOptions<AppSettings> appSettings)
   {
      _appSetting = appSettings;
   }

   public Student GetStudentById(Guid studentId)
   {
      // your code here
   }
}

И вы зарегистрируете его как: services.AddSingleton<IStudentRepository, StudentRepository>();

Затем на своей странице вы упоминалось, что вам придется ввести IStudentRepository и использовать его вместо new Student();

Sidenote: Приведенное выше предложение может помочь вам протестировать (во время разработки или в модульных тестах) свой код, как вы можете поменять реализацию на основе БД с фиктивной

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...