依赖注入实例化接口的更优方案?重复注入代码替代方法咨询
更简洁的依赖注入实例化方式
嘿,我太懂你这种被重复模板代码折磨的感觉了!你现在写的构造函数注入写法是DI的基础实现,但确实冗余——毕竟你一直在重复“声明字段→构造函数传参→赋值给字段”这一套流程。好在C#的后续版本和DI最佳实践里有好几种更简洁的方案,既能减少冗余,又完全符合规范:
1. C# 6+:只读自动属性简化
不用先声明私有字段,直接用只读自动属性,在构造函数里完成赋值。这样省去了字段声明的步骤,同时保证属性是只读的(更安全,避免后续被意外修改):
public class SomeController { // 直接声明只读自动属性 public IService1 Service1 { get; } public IService2 Service2 { get; } // 构造函数仅负责赋值 public SomeController(IService1 service1, IService2 service2) { Service1 = service1; Service2 = service2; } }
2. C# 9+:主构造函数(极简版)
C# 9引入的主构造函数把构造参数直接放在类名后面,彻底省去了构造函数体的冗余代码。到了C# 12,还支持直接将构造参数提升为公开/私有属性,连属性声明都可以省:
基础用法(C# 9+)
直接在类内使用构造参数,不用额外声明成员:
public class SomeController(IService1 service1, IService2 service2) { public void DoBusinessLogic() { // 直接用构造参数 service1.ProcessData(); service2.SaveResult(); } }
进阶自动提升(C# 12+)
如果需要把参数暴露为类的属性,直接在参数前加访问修饰符(比如public),编译器会自动帮你生成对应的只读属性:
// 一行搞定类声明+DI注入 public class SomeController(public IService1 Service1, public IService2 Service2) { // 直接用Service1、Service2属性即可 }
为什么原来的写法冗余?
你之前的代码本质上是在做重复的绑定工作:手动声明字段,再手动把构造参数赋值给字段。上面的方案都是让C#编译器帮你完成这些机械性的重复劳动,既减少了手写代码量,也降低了写错的概率(比如字段名和参数名拼写不一致)。
注意事项
- 这些写法完全兼容主流DI框架(比如ASP.NET Core DI、Autofac等),框架会正常解析构造参数并完成注入,不用担心兼容性问题。
- 核心原则不能丢:依然要依赖**抽象(接口)**而不是具体实现,保持类的单一职责,这些是DI的核心价值,简洁写法只是减少模板代码而已。
内容的提问来源于stack exchange,提问作者haugan
相关产品推荐
相关产品推荐

