Задать вопрос
Контакты
Местоположение
Россия, Тюменская обл. и Ханты-Мансийский АО, Тюмень

Наибольший вклад в теги

Все теги (15)

Лучшие ответы пользователя

Все ответы (28)
  • Что предпочтительнее: наследование или обёртка?

    SergeyEgorov
    @SergeyEgorov
    Веб разработчик
    Парсер в данном случае просто интерфейс. Поскольку Python - язык с динамической типизацией, то наследование или обертки не требуются вовсе. Просто все конкретные парсеры должны реализовать подразумеваемый интерфейс:
    class CsvParser:
        def parse(self, file_name):
    
    class XlsParser:
        def parse(self, file_name);


    Экземпляры конкретных парсеров, по мере их появления складываем в обычный словарь, где ключ - это расширение файла, под которое заточен парсер.

    { 'csv': CsvParser(), 'xls': XlsParser(), 'xml': XmlParser() }


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

    class ParserProvider:
            def provide(file_name):
    Ответ написан
    Комментировать
  • Как избавиться от ошибки "Both an existing DbConnection and a connect" при тестировании приложения в xUnit?

    SergeyEgorov
    @SergeyEgorov
    Веб разработчик
    Ну так в примере https://docs.microsoft.com/en-us/ef/core/miscellan... , из которого вы код взяли английским же по белому написано https://docs.microsoft.com/en-us/ef/core/miscellan...

    А вы тем не менее у себя именно и настраиваете два поставщика баз в контексте.

    Здесь настраиваемся на использование файлового экземпляра:
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
    	optionsBuilder.UseSqlite("Filename=dbTest.db", options =>
    	{
    		options.MigrationsAssembly(Assembly.GetExecutingAssembly().FullName);
    	});
    
    	if (!optionsBuilder.IsConfigured)
    	{
    		optionsBuilder.UseSqlite("Filename=dbTest.db");
    	}
    
    	base.OnConfiguring(optionsBuilder);
    }


    А в тесте хотим чтобы база разворачивалась в памяти:
    var connection = new SqliteConnection("DataSource=:memory:");
    connection.Open();
    
    var options = new DbContextOptionsBuilder<MyDbContext>()
    	.UseSqlite(connection)
    	.Options;


    Исправьте метод OnConfiguring:

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
    	if (!optionsBuilder.IsConfigured)
    	{
    		optionsBuilder.UseSqlite("Filename=dbTest.db", options =>
    		{
    			options.MigrationsAssembly(Assembly.GetExecutingAssembly().FullName);
    		});
    	}
    
    	base.OnConfiguring(optionsBuilder);
    }
    Ответ написан
    1 комментарий
  • Как автоматически менять ссылку на файл/видео?

    SergeyEgorov
    @SergeyEgorov
    Веб разработчик
    Чтобы такое реализовать, конечный потребитель не должен никогда видеть реальный URL ресурса, к которому ограничивается доступ.

    Конечному потребителю отдается ссылка на прокси метод с приложенным одноразовым токеном, срок действия которого ограничен. Примерно так: `https://acme.videos/download?token=98sт3nl128d29sh... При этом метод download при получении запроса, проверяет действителен ли еще токен, и если токен действителен, то он загружает видео из внутреннего хранилища и отправляет его потребителю.
    Ответ написан
    Комментировать
  • Как правильно организовать обращение к внешнему REST сервису?

    SergeyEgorov
    @SergeyEgorov
    Веб разработчик
    В неправильном.
    Ответ написан
    Комментировать
  • Правильно я понял паттерн Command?

    SergeyEgorov
    @SergeyEgorov
    Веб разработчик
    Решил что-ли все шаблоны разом выучить? Суть шаблона команда в том, что внутри может быть инкапсулировано любое поведение, а выполнено оно может быть унифицировано, каким угодно пользователем:

    public interface Command
    {
      void execute();
    }
    
    public class FindUserCommand : Command
    {
      public void execute()
      {
        /// Здесь у нас код, который ищет пользователя
      }
    }
    
    public class DeleteUserCommand : Command
    {
      public void execute()
      {
        /// А здес у нас код, который удаляет пользователя
      }
    }
    
    FindUserCommand findUser = new FindUserCommand();
    DeleteUserCommand deleteUser = new DeleteUserCommand();
    
    /// Поскольку оба этих класса реализуют абстракцию Command
    /// мы можем поместить их экземпляры например в коллекцию
     
    HashSet<Command> commands = new HashSet<Command>();
    commands.Add(findUser);
    commands.Add(deleteUser);
    
    /// И отдать затем эту коллекцию кому-нибудь, кто вообще 
    /// ничего не знает про FindUserCommand и DeleteUserCommand
    /// а знает только про Command. И не смотря на это, этот кто-то
    /// совершенно спокойно может выполнить инкапсулированное 
    /// внутри команд поведение.
    
    foreach(Command command in commands)
    {
      command.execute();
    }
    Ответ написан
    Комментировать