From 4a6dd951a8e41584d95e04df87bd63bd23b6877a Mon Sep 17 00:00:00 2001 From: muqiuhan Date: Mon, 31 Mar 2025 02:02:49 +0000 Subject: deploy: d690f87fb03551d086dcd146ee9f99bee7a86925 --- .../index.html" | 12 ++++++------ search.xml | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git "a/2025/03/31/\345\234\250F-\344\270\255\345\244\204\347\220\206\345\244\215\346\235\202\344\276\235\350\265\226\346\263\250\345\205\245\347\232\204\345\256\236\350\267\265\346\214\207\345\215\227/index.html" "b/2025/03/31/\345\234\250F-\344\270\255\345\244\204\347\220\206\345\244\215\346\235\202\344\276\235\350\265\226\346\263\250\345\205\245\347\232\204\345\256\236\350\267\265\346\214\207\345\215\227/index.html" index 3a9b6516..cbe001ec 100644 --- "a/2025/03/31/\345\234\250F-\344\270\255\345\244\204\347\220\206\345\244\215\346\235\202\344\276\235\350\265\226\346\263\250\345\205\245\347\232\204\345\256\236\350\267\265\346\214\207\345\215\227/index.html" +++ "b/2025/03/31/\345\234\250F-\344\270\255\345\244\204\347\220\206\345\244\215\346\235\202\344\276\235\350\265\226\346\263\250\345\205\245\347\232\204\345\256\236\350\267\265\346\214\207\345\215\227/index.html" @@ -171,7 +171,7 @@

在F#中处理复杂依赖注入的实践指南

依赖注入(DI)是构建松耦合、可维护系统的核心模式。在面向对象语言中,DI框架(如Spring)通过反射和容器管理依赖关系。在 F# 中,则更倾向于利用语言特性(如 Partial Application 和 Type Inference)实现依赖管理。


-

一、传统方法:Partial Application

在函数式编程中,Partial Application 是传递依赖的常用方式。例如:

+

一、传统手艺:Partial Application

在函数式编程中,Partial Application 是传递依赖的常用方式。例如:

1
2
3
let foo bar baz request = ...
let wired = foo dependency1 dependency2
let response = wired request

优点:

@@ -180,11 +180,11 @@
  • 符合函数式编程的纯函数理念。
  • 缺点:

    -
      -
    1. 参数爆炸:当功能扩展时,参数数量激增(如日志、数据库、加密等)。
    2. -
    3. 维护困难:新增依赖需修改所有调用点的参数传递。
    4. -
    5. 隐式依赖:难以从函数签名直接区分核心参数与辅助依赖。
    6. -
    +

    二、结构化方法:单一环境参数(env)

    为解决参数爆炸问题,可将依赖封装为单一环境对象env,并通过接口约束访问权限:

    1
    2
    3
    4
    5
    6
    7
    8
    [<Interface>] type ILog = abstract Logger: ILogger
    [<Interface>] type IDb = abstract Database: IDatabase

    module Log =
    let info (env: #ILog) = env.Logger.Info("Message")

    module Db =
    let fetchUser (env: #IDb) = env.Database.Query(...)
    diff --git a/search.xml b/search.xml index b23982ff..1b4e4552 100644 --- a/search.xml +++ b/search.xml @@ -3387,7 +3387,7 @@

    在F#中处理复杂依赖注入的实践指南

    依赖注入(DI)是构建松耦合、可维护系统的核心模式。在面向对象语言中,DI框架(如Spring)通过反射和容器管理依赖关系。在 F# 中,则更倾向于利用语言特性(如 Partial Application 和 Type Inference)实现依赖管理。


    -

    一、传统方法:Partial Application

    在函数式编程中,Partial Application 是传递依赖的常用方式。例如:

    +

    一、传统手艺:Partial Application

    在函数式编程中,Partial Application 是传递依赖的常用方式。例如:

    let foo bar baz request = ...
    let wired = foo dependency1 dependency2
    let response = wired request

    优点:

    @@ -3396,11 +3396,11 @@
  • 符合函数式编程的纯函数理念。
  • 缺点:

    -
      -
    1. 参数爆炸:当功能扩展时,参数数量激增(如日志、数据库、加密等)。
    2. -
    3. 维护困难:新增依赖需修改所有调用点的参数传递。
    4. -
    5. 隐式依赖:难以从函数签名直接区分核心参数与辅助依赖。
    6. -
    +

    二、结构化方法:单一环境参数(env)

    为解决参数爆炸问题,可将依赖封装为单一环境对象env,并通过接口约束访问权限:

    [<Interface>] type ILog = abstract Logger: ILogger
    [<Interface>] type IDb = abstract Database: IDatabase

    module Log =
    let info (env: #ILog) = env.Logger.Info("Message")

    module Db =
    let fetchUser (env: #IDb) = env.Database.Query(...)
    -- cgit v1.2.3