ASP.NET 核心依赖注入单个聚合 class 而不是多个单独的构造函数注入
ASP.NET Core Dependency Injection Single aggregate class instead of multiple separate constructor injections
在我的 ASP.NET Core Web API 中,我有几个控制器在它们的构造函数中接受超过 4-5 个参数,这对我来说不太好。我正在考虑创建一个聚合 class ,其中包含我经常使用的所有单独对象。
我的意思是,例如,而不是这个:
public SomeController : Controller
{
public SomeController(
IService1 service1,
IService2 service2,
Config1 config1,
Config2 config2)
{
}
}
写这样的东西:
// of course registered in DI services.AddSingleton<MyToolkit>()
public class MyToolkit
{
public MyToolkit(
IService1 service1,
IService2 service2,
Config1 config1,
Config2 config2)
{
...
}
public IService1 Service1 { get; }
public IService2 Service2 { get; }
public Config1 Config1 { get; }
public Config2 Config2 { get; }
}
public SomeController : Controller
{
private readonly MyToolkit _toolkit;
public SomeController(MyToolkit toolkit) { _toolkit = toolkit; }
[HttpGet]
public IActionResult GetSomething()
{
return _toolkit.Service1.GetSomething();
}
}
这种方法 (MyToolkit class) 是否违反任何现代设计原则?这种方法是否被视为反模式?
首先检查控制器级别是否确实需要所有这些依赖项。
有很多依赖项通常表明对象 class 很可能做了太多事情(违反 SRP)。
如果那些注入到聚合中的依赖项只是作为属性公开,那么控制器和聚合对于执行其功能明确需要什么是不诚实的。 (显式依赖原则)
如果在使用这些依赖项的控制器中发生了功能,并且实际上应该在它自己的 class 中,那么抽象出该功能及其依赖项。 (关注点分离 - SoC)
您当前基于提供的示例的方法只是把罐头踢到路边,可以看作是一种代码味道。
在我的 ASP.NET Core Web API 中,我有几个控制器在它们的构造函数中接受超过 4-5 个参数,这对我来说不太好。我正在考虑创建一个聚合 class ,其中包含我经常使用的所有单独对象。 我的意思是,例如,而不是这个:
public SomeController : Controller
{
public SomeController(
IService1 service1,
IService2 service2,
Config1 config1,
Config2 config2)
{
}
}
写这样的东西:
// of course registered in DI services.AddSingleton<MyToolkit>()
public class MyToolkit
{
public MyToolkit(
IService1 service1,
IService2 service2,
Config1 config1,
Config2 config2)
{
...
}
public IService1 Service1 { get; }
public IService2 Service2 { get; }
public Config1 Config1 { get; }
public Config2 Config2 { get; }
}
public SomeController : Controller
{
private readonly MyToolkit _toolkit;
public SomeController(MyToolkit toolkit) { _toolkit = toolkit; }
[HttpGet]
public IActionResult GetSomething()
{
return _toolkit.Service1.GetSomething();
}
}
这种方法 (MyToolkit class) 是否违反任何现代设计原则?这种方法是否被视为反模式?
首先检查控制器级别是否确实需要所有这些依赖项。
有很多依赖项通常表明对象 class 很可能做了太多事情(违反 SRP)。
如果那些注入到聚合中的依赖项只是作为属性公开,那么控制器和聚合对于执行其功能明确需要什么是不诚实的。 (显式依赖原则)
如果在使用这些依赖项的控制器中发生了功能,并且实际上应该在它自己的 class 中,那么抽象出该功能及其依赖项。 (关注点分离 - SoC)
您当前基于提供的示例的方法只是把罐头踢到路边,可以看作是一种代码味道。