首页
学习
活动
专区
圈层
工具
发布

NET 10 + C#12 的现代化重构指南

曾几何时,某些设计模式是 .NET 优秀架构的基石。我们为 DbContext 包装仓储层,为缓存构建装饰器,精心设计线程安全的单例类。这些模式确实解决过问题——至少在当年如此。...> new Widget(); } 现代替代: // 依赖注入容器自动构造 builder.Services.AddTransient(); // 需额外参数时 var widget...过时模式 ✅ .NET 10 替代方案 仓储层+工作单元 直接使用 DbContext 服务定位器 构造函数/Minimal API 注入 日志包装器 源生成器 [LoggerMessage] 工厂模式...重构行动指南 放手依赖多年的模式或许不适——但随着 .NET 进化,这些模式常成为冗余脚手架。...三步重构法: 1️⃣ 从小处开始: • 将单个仓储替换为直接 DbContext 调用 • 用源生成日志替换一个包装器 2️⃣ 转移横切逻辑: • 将装饰器功能迁移到中间件层 3️⃣ 体验收益: • 代码可读性提升

26810

【小知识】小例子说明Spring的核心思想之一:控制反转。

装饰设计模式(也即包装设计模式) 口诀:     1、编写一个类,实现与被包装类相同的接口。...(若重写方法的时候,还需要用到其他类的对象,那我们就在构造方法中继续注入即可)     5、对于不需要改写的方法,使用被包装类对象调用原有的方法。   ...,使用被包装类对象调用原有的方法。...口诀:     1、编写一个类,实现与被包装类相同的接口。(这样他们就具备了相同的行为)     2、定义一个被包装类类型的变量,即引用,用于接收被包装的对象。     ...3、定义构造方法,把被包装类的对象注入,给被包装类变量赋值。(因为后面我要用该包装类的对象,所以要注入进来)     4、对于不需要改写的方法,使用包装类对象调用原有的方法。

60010
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【C++】C++11中的常见语法(下)

    算法,都要重新去写一个类,如果每次比较的逻辑不一样,还要去实现多个类,特别是相同类的命名,这些都给编程者带来了极大的不便。...函数对象与 lambda 表达式 函数对象,又称为仿函数,即可以像函数一样使用的对象,就是在类中重载了 operator() 运算符的类对象。...三、包装器 1. function 包装器 function 包装器 也叫作适配器,C++ 中的 function 本质是一个类模板,也是一个包装器。 要学包装器,首先需要知道包装器包装的是什么?...其实包装器包装的是可调用对象,目前我们学习到的可调用对象有:函数指针、仿函数、lambda,我们要学的包装器就是要包装它们三个中的任意一个。....)>; 模板参数说明: Ret: 被调用函数的返回类型 Args…:被调用函数的形参 下面我们来简单使用一下包装器包装可调用对象,假设我们需要包装一个实现两个数交换的可调用对象

    36910

    绝对干货 | Kotlin内联类工作原理及使用案例,看完你会回来谢我的

    这正是Kotlin中内联类的一大卖点:内联类时,除非绝对必要,否则类本身不会在字节码中使用。内联类大大减少了运行时的空间开销。 运行时 在运行时,可以将内联类表示为包装类型和基础类型。...除了一些显而易见的东西,例如value字段及其getter之外,构造函数是私有的,而新对象将通过Constructor_impl创建,该对象实际上并不使用包装器类型,而仅返回传入的基础类型。...尽管使用了静态的builder_impl函数,它只是返回一个int值,然后将其传递给take函数,该函数也对我们最初在源代码中拥有的内联类的类型一无所知。...为了解决这个问题,您可能会创建一个包装类型,或者使用现有的Pair类从该函数返回一对值。这些方法虽然显然会分配额外的空间,但仍然是有效的,在特殊情况下应避免使用。内联类可以帮助您。...() = jacksonObjectMapper().readValueT>(this.value) 当我们引入用于保存JSON数据的字符串的包装器并相应地将扩展名更改为使用JsonString接收器时

    1.6K30

    【笔记】《重构: 改善既有代码的设计》

    , 先写一个新函数, 然后将其用旧函数来包装可以避免一些接口修改的问题 临时变量只属于函数本身, 容易助长冗长的函数, 且我们容易忘记临时变量的跟踪导致一些意外的错误计算 用函数调用消除临时变量可以让程序更直观...依赖统计和性能度量大大优化来重构的效果 3 代码的坏味道 3.1 重复代码 如果项目内多个地方看到了相同的代码, 那就想办法将其合为一 3.2 过长函数 多对大函数进行分解, 每当需要长注释的时候就应该将所需的分段进行包装了...因此可以包装一个足够全面的参数类, 然后让目标函数自己从参数对象中获取自己需要的参数 但是有时候不希望两个对象由于大量和互相使用而耦合, 那种时候还是需要适当提炼为函数, 但是还是要保持参数列别太长 3.5..., 但是需要接管原类的构造, 在原类构造后则只能通过逐元素拷贝构造来实现副本, 而包装类能做到的事情更多, 用户应该能够自然地将包装类当作原类使用....如果两个函数相似但不相同, 则可以试着用模板类来优化并提取 11.3 构造函数本体上移 只在子类中保留构造函数有区别的部分, 然后主体通过调用基类构造来实现 11.4 函数下移 11.2的反面, 主要是当一些子类完全用不到某个操作时下移

    1.9K20

    绝对干货 | Kotlin内联类工作原理及使用案例,看完你会回来谢我的

    这正是Kotlin中内联类的一大卖点:内联类时,除非绝对必要,否则类本身不会在字节码中使用。内联类大大减少了运行时的空间开销。 运行时 在运行时,可以将内联类表示为包装类型和基础类型。...除了一些显而易见的东西,例如value字段及其getter之外,构造函数是私有的,而新对象将通过Constructor_impl创建,该对象实际上并不使用包装器类型,而仅返回传入的基础类型。...尽管使用了静态的builder_impl函数,它只是返回一个int值,然后将其传递给take函数,该函数也对我们最初在源代码中拥有的内联类的类型一无所知。...为了解决这个问题,您可能会创建一个包装类型,或者使用现有的Pair类从该函数返回一对值。这些方法虽然显然会分配额外的空间,但仍然是有效的,在特殊情况下应避免使用。内联类可以帮助您。...() = jacksonObjectMapper().readValueT>(this.value) 当我们引入用于保存JSON数据的字符串的包装器并相应地将扩展名更改为使用JsonString接收器时

    82720

    Java-包装器类

    参考链接: Java包装器 所有的基本类型都有一个与之对应的类,这些类称为包装器类。对象包装器类是不可改变的,即一旦构造类包装器类,就不允许更改包装在其中的值。...s表示的整数数值进行初始化后的新Integer对象Integer(int value)Integer类的构造函数Integer(String s)Integer类的构造函数,将字符串s表示的整数数值赋值给...value(默认为10进制)  包装器类  每个包装器类都有两个构造函数:  Type(type value);//以基本类型为参数来构造包转器类 Type(String value);//将字符串转换为相应的包装器类型...+基本类型(包转器类型)字符串向数值类型转换     通过包转器类的构造函数通过包装器类的valueOf(String s) 返回一个包装器类通过包转器类的静态方法 parseType()(Type为相应的基本类型...- 当使用== 进行比较的时候,如果== 两边都是包装器类型,那么比较将是引用地址是否相同;如果其中一边为包装器类型,另一边是基本类型,那么包装器类型先自动拆箱为基本类型,那么将是两个基本类型之间的比较

    88320

    【c++11】c++11新特性(下)(可变参数模板、default和delete、容器新设定、包装器)

    当然,可变参数模板的函数形参也可以用左值引用或右值引用表示,其折叠规则与普通模板相同。...八、函数包装器 函数包装器是c++11引入的工具,它可以对函数进行“封装”,后续需要时调用,功能类似于函数指针,且更加安全。...c++11的函数包装器一共有两个:function和bind。...fun函数 //函数调用 f(1, 2, 3); return 0; } 运行结果: 使用bind包装fun函数时,bind的参数列表第一个位置是fun函数的地址;其余位置表示要传入的参数的代号...总结 本篇文章我们学习了c++11的四个新语法:可变参数模板、default和delete、容器的新设定和函数包装器。它们大大提高了c++编程的灵活性,也提高了我们的开发效率。

    27000

    C++11(3)

    template void ShowList(Args... args) { } 我们可以发现其实参数包就是将多个模版参数类型和参数都使用Args包装起来了,为了辨别与普通参数的区别...5, 8, 4, 65, 6, 5); return 0; } 运行结果: ;除了这种方法之外,还可以使用数组结合逗号表达式来一次性使用所有的参数; 2.使用数组+逗号表达式展开 这种展开参数包的方式...{}可以自动调用构造函数初始化,极大地方便了我们;但是除此之外;可变参数包的使用,使得emplace_back可以直接传递pair的参数就可以自动按照顺序调用构造;类似与上面一次使用多个参数的情况; 注意...包装器 function包装器 function 包装器 也叫作适配器。 C++ 中的 function 本质是一个类模板,也是一个包装器。那么我们来看看,我们为什么需要function 呢?...包装器可以很好的解决上面的问题 std::function在头文件 // 类模板原型如下 template T> function; // undefined

    46510

    深入浅出JVM(六)之前端编译过程与语法糖原理

    ,作用在方法、类、接口上时称为泛型方法、泛型类、泛型接口Java中的泛型是类型擦除式泛型,泛型只在源代码中存在,在编译期擦除泛型,并在相应的地方加上强制转换代码与具现化式泛型(不会擦除,运行时也存在泛型...包装类的 == 就是去比较引用地址,不会自动拆箱条件编译布尔类型 + if语句 : 根据布尔值类型的真假,编译器会把分支中不成立的代码块消除(解语法糖)Lambda原理编写函数式接口 @FunctionalInterface...,这个方法中很明显就是lambda中的代码在使用lambda表达式的类中隐式生成一个静态私有的方法,这个方法代码块就是lambda表达式中写的代码执行class文件时带上参数java -Djdk.internal.lambda.dumpProxyClasses...包名.类名即可显示出这个匿名内部类 图片使用invokedynamic生成了一个实现函数式接口的匿名内部类对象,在重写函数式接口的方法实现中调用使用lambda表达式类中隐式生成的静态私有方法总结本篇文章以...,性能有损耗且在运行时无法获取泛型类型增加for循环则是使用迭代器实现,并在适当位置插入强制转换;可变长参数则是创建数组进行装载参数自动拆装箱提供基本类型与包装类的转换,但包装类尽量不使用==,这是去比较引用地址

    31921

    Java学习笔记(三)——类和对象

    构造方法可以在类实例化的过程中做一些初始化的工作。 构造方法的名称必须与类的名称相同,并且没有返回值。 每个类都有构造方法。...如果没有显式地为类定义构造方法,Java编译器将会为该类提供一个默认的构造方法。 说明: 构造方法不能被显示调用。 构造方法不能有返回值,因为没有变量来接收返回值。...Java程序的main() 方法必须设置成公有的,否则,Java解释器将不能运行该类。...类级变量又称全局级变量或静态变量,需要使用static关键字修饰,你可以与 C/C++ 中的 static 变量对比学习。...t.test1(); } } this关键字 this 关键字用来表示当前对象本身,或当前类的一个实例,通过 this 可以调用本对象的所有方法和属性。

    65110

    SWIG 官方文档第二部分 - 机翻中文人肉修正

    C++ 编译器构造,不能从包装器中轻松访问,因为它们旨在用于使用特殊std::initializer_list 类型的类的编译时初始化。...,例如,在 Python 中,以下将调用带有 std::vector的构造函数: Python>>> c = Container( [1, 2, 3, 4] ) 如果您无法修改被包装的类,请考虑忽略初始化列表构造函数并使用...默认函数的包装器当然可以在目标语言中使用。显式默认函数对 SWIG 包装没有直接影响,因为声明的处理方式与 SWIG 解析的任何其他方法声明非常相似。 删除的函数还旨在防止调用函数时进行隐式转换。...如果目标语言不支持代理类,则使用此宏将生成与 %pointer_functions() 宏相同的示例函数。 应该注意的是,类接口确实引入了一个新对象或将一个指针包裹在一个特殊的结构中。...然而,参数转换细节和暴露给解释器的公共 API 各不相同。 9.4.3 STL 异常 许多 STL 包装函数添加了参数检查,如果值无效,将抛出依赖于语言的错误/异常。经典的例子是数组边界检查。

    3.1K20

    Kotlin Vocabulary | 内联类 inline class

    有参构造函数是私有的,第二个构造函数的名字中包含了一个 "-",其在 Java 中为无效字符。这意味着无法从 Java 实例化内联类。...覆盖使用原生类型和内联类作为参数的函数 定义一个方法时,Kotlin 编译器允许使用原生类型和不可空内联类作为参数: fun pet(doggoId: Long) {} fun pet(doggoId:...为了实现此功能,Kotlin 编译器会改写函数的名称,并使用内联类作为函数参数。 在 Java 中使用内联类 我们已经讲过,不能在 Java 中实例化内联类。那可不可以使用呢?...这意味着未来,不熟悉这段代码的开发者,也没法像在数据类中那样,可以给构造函数添加参数,从而导致类的复杂度被错误地增加。...它是否会发布正式版,以及正式版发布时,它的实现是否与现在相同,都还是未知数。 因此,既然您了解了内联类的好处和限制,就可以在是否以及何时使用它们的问题上做出明智的决定。

    83930

    Kotlin Vocabulary | 内联类 inline class

    有参构造函数是私有的,第二个构造函数的名字中包含了一个 "-",其在 Java 中为无效字符。这意味着无法从 Java 实例化内联类。...覆盖使用原生类型和内联类作为参数的函数 定义一个方法时,Kotlin 编译器允许使用原生类型和不可空内联类作为参数: fun pet(doggoId: Long) {} fun pet(doggoId:...为了实现此功能,Kotlin 编译器会改写函数的名称,并使用内联类作为函数参数。 在 Java 中使用内联类 我们已经讲过,不能在 Java 中实例化内联类。那可不可以使用呢?...这意味着未来,不熟悉这段代码的开发者,也没法像在数据类中那样,可以给构造函数添加参数,从而导致类的复杂度被错误地增加。...它是否会发布正式版,以及正式版发布时,它的实现是否与现在相同,都还是未知数。 因此,既然您了解了内联类的好处和限制,就可以在是否以及何时使用它们的问题上做出明智的决定。

    35410

    【C++篇】C++11新特性总结2

    ,empalce系列的接口均为模板可变参数,功能上 兼容push和insert系列,,empalce还支持直接插入构造T对象的参数,这样有些场景会更高效一些,可以直接在容器空间上构造T对象。...默认移动赋值与上面的移动构造完全类似。 如果你提供了移动构造或者移动赋值,编译器不会自动提供拷贝构造和拷贝赋值。...适用于:默认构造函数、析构函数、拷贝构造函数、拷贝赋值运算符、移动构造函数、移动赋值运算符。 使用场景: 当类中定义了其他构造函数时,编译器可能不再自动生成默认构造函数。...编译器检查:如果使用了override,但实际并没有覆盖基类中的虚函数(例如,方法签名不匹配),编译器会报错。...函数指针,lambda,仿函数等可调用对象的类型各不相同。std::function的又是就是统一类型,对他们进行包装。

    10810

    【C++】C++11新特性——可变参数模版、lambda、包装器

    之前的类模版和函数模版中只能含固定数量的模版参数。...函数捕捉列表必须为空 在块作用域中的lambda函数仅能捕捉父作用域中局部变量,捕捉任何非此作用域或者非局部变量都 会导致编译报错 lambda表达式之间不能相互赋值,即使看起来类型相同 允许使用一个lambda...表达式拷贝构造一个新的副本 仿函数是在类中重载了operator(),使之能像函数一样可以调用。...模板参数说明: Ret: 被调用函数的返回类型 Args…:被调用函数的形参 function包装器也叫作适配器。C++中的function本质是一个类模板,也是一个包装器。...4.2 bind bind函数也是定义在头文件中,是一个函数模版,它就像一个函数包装器(适配器),接受一个可调用对象,生成一个新的可调用对象来“适应”原对象的参数列表。

    86110

    JavaScript 模式》读书笔记(3)— 字面量和构造函数3

    类”的构造函数方式思考。...也就是说,如果在一个循环中创建了相同的正则表达式,那么后面返回的对象与前面创建的对象相同,并且所有的属性都将被设置为第一次的值。这种行为已经在ES5中得到了改变,并且字面量会创建新的对象。   ...最后要说明的是,调用RegExp()时不使用new的行为与使用new的行为时相同的。 七、基本值类型包装器 JavaScript有五个基本的值类型:数字、字符串、布尔、null和undefined。...(3,6); // "key" // 与数值的方法相同 (22 / 7).toPrecision(3); // "3.14"   由于基本值类型也可以充当对象,只要需要它们这样做,不过通常并没有理由去使用更为冗长的包装构造函数...当使用时没有带new操作符时,包装构造函数将传递给它们的参数转换成一个基本类型值: typeof Number(1);// 输出“number” typeof Number("1");// 输出“number

    83320

    Java 比较器 和 包装类

    Java比较器 背景: 在Java中经常会涉及到多个对象的排序问题,那么就涉及到对象之间的比较 Java中的对象, 正常情况下, 只能进行比较 == 比较对象地址值,是否相同 !...= 比较对象地址值,是否相同,取反~ 不能使用 > 或 的 但是在开发场景中,我们需要对多个对象进行排序,言外之意,就需要比较对象的大小 以 JD 商城举例场景: 查询商品可以对商品进行...//2.自动装箱 Integer c2 = 540; //3.使用提供的 valueof( int/String ); // 构造函数方式已经被淘汰了.....(str); /** 字符串转换为包装类 */ //通过构造函数 字符参数 //通过valueof(""); Integer integer...… 并且内部定义了一些方法,方便使用… 结合: 自动装箱/拆箱 基本数据类型,使用起来更加的心用手~ Integer与int的区别 int是java提供的8种原始数据类型之一 Java为每个原始类型提供了封装类

    59510

    C++11特性大杂烩

    ,main函数里实现了两个与Rate类中仿函数成员相同作用的lambda表达式,分别是r2和r3。...构造+移动构造优化成构造,稍稍减少了一些消耗。但对于只有浅拷贝的类,构造+浅拷贝优化成构造,效率大大提升。图片图片包装器这里介绍的是function包装器。function包装器 也叫作适配器。...;模板处需要传递类的名称(传递this指针);调用处需要传递类的匿名对象。下面是对function包装器的使用。可以看到这里有一个useF模板函数,参数是两个模板参数。...图片然而这三者的返回值类型相同(都是double),传递给useF函数的参数个数相同,形参类型相同,那么这里可以用包装器对这三个对象进行包装,然后通过function对象对这三者进行传参调用,这样就只会实例化出来一份...但只要是通过包装器调用类中成员函数就需要传递Sub()匿名对象。现可以通过bind把Sub()匿名对象这个参数绑定在表达式中,后续参数不用传。

    1.2K50

    C++11『lambda表达式 ‖ 线程库 ‖ 包装器』

    线程安全 问题 首先要明白 线程拥有自己独立的栈结构,但对于全局变量等 临界资源,是直接被多个线程共享的 如果想给线程回调函数传递 左值引用 类型的参数,需要使用 ref 引用包装器函数进行包装传递...线程库中还有一个 future 类,用于 异步编程和数据共享,并不是很常用,这里就不作介绍,使用细节可以看看这篇文章 《C++11中std::future的使用》 3.包装器 包装器 属于 适配器...根据给出的指令,调用对应的函数 function 包装器 还可以用在刷题中,比如下面这道题目中,就可以使用 包装器 在 运算符 与 具体操作 之间建立映射关系,使用起来十分方便 150....绑定普通参数显得没意思,bind 绑定 参数个数用在 类的成员函数 上才舒服,比如对之前 function 包装器 包装 类的成员函数 代码进行优化,直接把 类对象 这个参数绑定,调用时就不需要手动传递...,但实际调用时,仍然需要传递对应函数的参数,否则无法进行函数匹配调用,当然实际传入的参数是绑定的值,这里传参只是为了进行匹配;并且如果不对类对象进行绑定,需要更改包装器中的类型,调用时也需要传入参数进行匹配

    1K10
    领券