c# Слияние услуг в один - PullRequest
       3

c# Слияние услуг в один

0 голосов
/ 23 января 2020

У меня есть этот сервис, который будет вызываться из веб-API, и я хочу посмотреть, есть ли способ объединить их вместе, используя передаваемую модель?

Могу ли я использовать что-то вроде getType, чтобы увидеть тип объекта?

    public ResultStatus InsertUsersDownload(UserLog userLog)
    {
        return Db.UsersDownload(userLog);
    }

    public ResultStatus InsertNonUsersDownload(NonUserLog nonUserLog)
    {
        return Db.NonUsersDownload(nonUserLog);
    }

Модель

1 Ответ

1 голос
/ 23 января 2020

Вы можете использовать оператор is для проверки типа. Тогда ваш метод будет выглядеть следующим образом:

public ResultStatus InsertDownload(object log)
 {
 if(log is UserLog userLog)
  {
  return glDb.UsersDownload(userLog);
  }
 else if(log is NonUserLog nonUserLog)
  {
  return glDb.NonUsersDownload(nonUserLog);
  }
 else
  {
  throw new ArgumentException("invalid type", nameof(log));
  }
 }

Если UserLog и NonUserLog имеют общий базовый класс, вы также можете использовать его вместо object.

Но вы должен действительно подумать, улучшает ли это ваш код. Если вам приходится проверять тип и делать разные вещи в зависимости от типа, это часто является признаком плохого дизайна класса.

РЕДАКТИРОВАТЬ: Я только что видел ваш код модели. Они имеют единственное отличие в том, что у вашего UserLog класса есть дополнительное свойство IsProfessional. Возможно, вы могли бы объединить ваши классы в один, добавив дополнительное свойство IsUser:

public class Log 
{
    public string CustomerId { get; set; }
    public string FileName { get; set; }
    public string Remote_Addr { get; set; }
    public string Local_Addr { get; set; }
    public string Http_User_Agent { get; set; }
    public string Http_Referer { get; set; }
    public bool? IsMobile { get; set; }
    public int? DeviceId { get; set; }
    public string AppType { get; set; }
    public bool? IsProfessional { get; set; }
    public bool IsUser { get; set; }
}

Тогда вы могли бы написать свою функцию следующим образом:

public ResultStatus InsertDownload(Log log)
 {
 if(log.IsUser)
  {
  return glDb.UsersDownload(log);
  }
 else
  {
  return glDb.NonUsersDownload(log);
  }
 }

Это дает то преимущество, что вы Может сигнатура метода более выразительна, чем метод, который принимает object в качестве параметра.

...