F# логирование структуры приложений / репозиториев и т.д.

Я постепенно переключаюсь на F# для многих моих домашних проектов, но я немного озадачен тем, как соединить вместе полные приложения, и, более того, межсекторные проблемы.

В C#, если я хочу регистрировать вещи, я бы использовал инъекцию зависимостей, чтобы передать ILogger в каждый класс, и тогда это можно назвать приятным и простым из кода. В своих тестах я могу проверить, что с учетом конкретной ситуации пишутся логи, передавая их в подражание и проверяя.

public class MyClass
{
    readonly ILogger _logger;
    public MyClass(ILogger logger)
    {
        _logger = logger;
    }

    public int Divide(int x, int y)
    {
        if(y == 0)
        {
            _logger.Warn("y was 0");
            return 0;
        }
        return x / y;
    }
}

В F# я использую гораздо больше модулей, так что выше стало бы

module Stuff

let divde x y =
    match y with 
    | 0 -> 0
    | _ -> x / y

Теперь, если бы у меня был модуль под названием Логинг, я мог бы просто открыть это и использовать функцию лога оттуда в случае, если y быть 0, но как бы я ввел это для юнит-тестирования?

Я мог бы иметь каждую функцию взять функцию лога (строка -> блок), а затем использовать частичное приложение, чтобы подключить их, но это, кажется, ужасно много работы, как и создание новой функции, которая обертывает фактический вызов внутри вызова логгера. Есть ли какой-то определенный паттерн или немного F#, которого мне не хватает, который может это сделать? (Я видел функцию kprintf, но до сих пор не знаю, как бы вы указали эту функцию для различных тестовых сценариев, используя конкретную реализацию для всего приложения)

Аналогично, как бы вы удалили репозиторий, в котором собирались данные? Нужно ли вам иметь какой-нибудь класс инстанцированных и установить на нем функции CRUD, или есть способ внедрить, какие модули вы открываете (кроме #define)

5
задан Dylan 20 September 2011 в 01:57
поделиться