Метод веб-службы читает только последний объект в списке - PullRequest
1 голос
/ 02 ноября 2019

Мне нужно создать приложение службы WCF, в котором хранится некоторая статическая информация в списках, а также методы для запроса этой информации. Служба размещается в консольном приложении и позже будет превращена в реальную базу данных с каркасом сущностей.

У меня есть следующие классы Doctor, Patient, UserAccount и интерфейс IService1,с методами, предназначенными для использования этими классами.

У меня пока есть 3 проблемы

  1. Метод входа в систему всегда возвращает false.
  2. Метод DoctorByID, возвращает только последний созданный Doctor объект
  3. Метод PatientByID такой же, как в методе DoctorByID.

Файлы cs находятся втот же проект, сборки проекта и веб-сервисы все обновляются. Когда я ставлю списки на часы, они заполняются, как и ожидалось. Я не знаю, где все идет не так.

//The interface and the classes 
[ServiceContract]
public interface IService1 
{ 
    [OperationContract]
    string DoctorById(string ID);
    [OperationContract]
    bool Login(string name, string ID)
} 

[DataContract]
public class Doctor 
{ 
    [DataMember]
    public static List<Doctor> ListOfDoctors = new List<Doctor>();
    [DataMember]
    public string Name { get; set; } 
    [DataMember]
    public string LastName { get; set; } 
    [DataMember]
    public string ID { get; set; } 
    [DataMember]
    public DateTime DateOfBirth { get; set; }

    public Doctor(string name, string lastName, string id, DateTime dateOfBirth) 
    {
        Name = name;
        LastName = lastName;
        ID = id;
        DateOfBirth = dateOfBirth;
        //Adds the created doctors to the list
        ListOfDoctors.Add(this);
    }
}
//The DataContracts for the patients and UserAccounts look almost the same.

//Object instantiation and method implemenation

public class Service1: IService1 
{
    public static Doctor doctor1 = new Doctor("Simon", "Doe", "doc1", new DateTime(1996, 08, 08));
    public static Doctor doctor2 = new Doctor("John", "Doe", "doc2", new DateTime(1966, 12, 10));
    public static Doctor doctor3 = new Doctor("Mike", "Ray", "doc3", new DateTime(1990, 02, 18));

    public static UserAccount user1 = new UserAccount("Edd", "password", true);
    public static UserAccount user2 = new UserAccount("Tony", "password", true);
    public static UserAccount user3 = new UserAccount("John", "1234", false);

    //METHOD FROM ISSUE NO.1
    public bool Login(string userName, string pass) 
    {
        bool answer = "";
        foreach(UserAccount acc in UserAccount.ListOfUsers) 
        {
            if (acc.UserName == userName && acc.Password == pass) 
            {
                if (acc.AdminRights == true) 
                {
                    Console.WriteLine("You have Admin Rights");
                    answer = true;
                }
                else Console.WriteLine("You do not have Admin rights");
                answer = false;
            }
        }
        else Console.WriteLine("Account does not exist");
        answer = false;
    }
    return answer ;
}

//METHOD FROM ISSUE NO.2
public string PatientById(string ID) 
{
    string answer = "";
    foreach(Patient p in Patient.ListOfPatients) 
    {
        if (p.ID == ID) 
        {
            answer = "patient ID :" + p.ID + " Name: " + p.name + "  LastName: " + p.lastName;
        }
        else 
        {
            answer = "The patient with this ID does not exist";
        }
    }
    return answer;
}

Так как я не могу публиковать фотографии здесь, я помещаю скриншоты на img. Их загрузка занимает пару секунд

Вот ссылки на выходные данные, которые я получил через тестовый клиент Wcf:

  1. https://ibb.co/h1ghZ7y - Функция входа в системувозвращает false, несмотря на то, что объект имеет значение bool, равное true.
  2. https://ibb.co/BqJWqQC -Функция DoctorByID возвращает "Идентификатор врача не существует", но объект с этим IDнаходится в списке.
  3. https://ibb.co/SQkJRcy -Функция DoctorByID возвращает данные об объекте, но делает это только тогда, когда я помещаю последний объект в список в качестве параметра.

1 Ответ

0 голосов
/ 02 ноября 2019

Хорошо, я пытаюсь найти начало.

//METHOD FROM ISSUE NO.1
public bool Login(string userName, string pass)
{
 bool answer="";
 foreach(UserAccount acc in UserAccount.ListOfUsers)
  {
   if(acc.UserName==userName && acc.Password == pass)
   { 
     if(acc.AdminRights==true)
     {
      Console.WriteLine("You have Admin Rights");
      answer=true;
     }
     else
     Console.WriteLine("You do not have Admin rights");
     answer= false;
     }
   }
  else
  Console.WriteLine("Account does not exist");
  answer= false;
 }
 answer odgovor;
}

Эта вещь никогда не скомпилируется. Зачем вам инициировать логическую переменную с ""? А что такое answer odgovor? И почему ваш метод ничего не возвращает?

Однако причина, по которой метод возвращает false, заключается в том, что у вас есть два таких места:

  if
  {
    ...
  }
  else
  Console.WriteLine("Account does not exist");
  answer= false;

... что означает. ..

  if
  {
    ...
  }
  else
  {
    Console.WriteLine("Account does not exist");
  }
  answer= false;

... потому что вы пропустили {} после else. Таким образом, код всегда будет достигать answer = false, независимо от того, был ли вход успешным или нет.

Вы могли бы легко найти это, пройдя по коду с помощью отладчика.


Второй ... ну ...

//METHOD FROM ISSUE NO.2
public string PatientById(string ID)
{
    string answer= "";
    foreach(Patient p in Patient.ListOfPatients)
    {
        if (p.ID == ID)
        {
            answer = "patient ID :" + p.ID + " Name: " + p.name + "  LastName: " +                             p.lastName; 
        }
        else
        {
            answer = "The patient with this ID does not exist";
        }
    }
    return answer;
}

Чтоздесь происходит то, что вы можете найти много пациентов по заданному идентификатору, но даже если вы это сделали, вы всегда перезапишете предыдущие строки новой. Вот почему будет возвращен только последний матч.

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