Как осуществить рефакторинг эти 2 похожих метода в один?

Вы должны зависеть только от FROM и добавить другие инструменты через RUN шагов. или используйте одно изображение для каждого приложения и соедините их вместе через сеть докеров или создав docker-compose.yml, что будет проще, вы можете проверить это через здесь . Использование нескольких FROM не означает, что вы будете иметь все 3 в 1.

Для получения дополнительной информации о том, как создать Dockerfile и Как развернуть ваше приложение с несколькими контейнерами, вы можете проверить учебник по началу работы из Docker

Чтобы запустить несколько сервисов внутри одного контейнера вам нужно использовать сервис-менеджер, такой как Supervisor. Проверьте следующую ссылку для получения более подробной информации: Multi-Service Container

5
задан Thomas Stock 6 May 2009 в 11:35
поделиться

3 ответа

Без реализации общего интерфейса, подобного предложенному @Grzenio, вы можете использовать универсальный метод, подобный этому:

    public List<SelectListItem> ToSelectList<T>(IEnumerable<T> enumerable, Func<T, string> text, Func<T, string> value, string defaultOption)
    {
        var items = enumerable.Select(f => new SelectListItem() { Text = text(f), Value = value(f) }).ToList();
        items.Insert(0, new SelectListItem() { Text = defaultOption, Value = "-1" });
        return items;
    }

    // use like

    t.ToSelectList(departments, d => d.Code + " - " + d.Description, d => d.Id.ToString(), "default");
    t.ToSelectList(functions, f => f.Description, f => f.Id.ToString(), "default");
7
ответ дан 18 December 2019 в 08:31
поделиться

Старый способ заключается в создании общего интерфейса для отдела и функции:

interface A
{
int ID{get;}
string Description{get;}
}

Вы реализуете описание для Отдела, чтобы вернуть d.Code + "-" + d. Описание . и напишите функцию для использования этого интерфейса вместо конкретных классов:

[NonAction]
    public List<SelectListItem> ToSelectList(IEnumerable<A> as, string defaultOption)
    {
        var items = as.Select(a => new SelectListItem() { Text = a.Description, Value = a.Id.ToString() }).ToList();
        items.Insert(0, new SelectListItem() { Text = defaultOption, Value = "-1" });
        return items;
    }

РЕДАКТИРОВАТЬ: Что касается использования обобщений, то в этом случае это не сильно поможет, потому что

  • передаваемым объектам необходимо реализовать Id и Description
  • Вы не возвращаете эти объекты, поэтому в этом отношении вам не нужно заботиться о безопасности типов дженериков
8
ответ дан 18 December 2019 в 08:31
поделиться

Фактически вы можете сделать это с помощью комбинации обобщенных функций и функций, что-то вроде этого (непроверенный может даже не скомпилироваться).

[NonAction]
public List<SelectListItem> ToSelectList<T>(IEnumerable<T> en, 
                                            Function<string, T> text, 
                                            Function<string, T> value, 
                                            string defaultOption)
{
    var items = en.Select(x => new SelectListItem() { Text = text(x) , Value = value(x) }).ToList();
    items.Insert(0, new SelectListItem() { Text = defaultOption, Value = "-1" });
    return items;
}

Затем вы можете отправить его с соответствующими лямбда-функциями (или вызовите напрямую).

[NonAction]
public List<SelectListItem> ToSelectList(IEnumerable<Department> departments, 
                                         string defaultOption)
{
    return ToSelectList<Department>(departments, d =>  d.Code + '-' + d.Description, d => d.Id.ToString(), defaultOption);

}
4
ответ дан 18 December 2019 в 08:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: