gpt4 book ai didi

c# - 构造函数注入(inject) (DI) 与静态工厂的横切问题?

转载 作者:太空狗 更新时间:2023-10-29 18:22:06 27 4
gpt4 key购买 nike

在大多数任意应用程序中,有许多横切问题需要在所有可用层中解决,例如日志记录、消息总线、配置。我注意到,在某些类中,如果使用 IoC 注入(inject)模块,它们往往会完全破坏构造函数。

public class MyService : IService 
{
public MyService(ILogger logger, IAppSettings settings, IEventBus eventBus...)
{

}
}

对于构造函数过度注入(inject)的常见情况,我倾向于将关注点折射到紧密相连的构建 block 中,这样我在类中的依赖性就会减少。然而,这对于横切概念是不可能的。

在日志框架中,静态工厂/服务似乎很受欢迎,例如

// Application root
MyLoggerService.SetFactory(log4NetFactory);

// Somewhere
MyLoggerService.GetLogger("name") // returns Log4NetLogger created by Log4NetFactory.

我的问题是:对于各种横切内容,这种方法是否合适?如果代码最终看起来像这样,有什么缺点:

public class MyService : IService
{

private readonly IReallyNeedThat _dependency;

public MyService(IReallyNeedThat dependency)
{
_dependency = dependency;
}

private readonly ILogger _logger = LoggerService.GetLogger("MyService");
private readonly IEventBus _eventBus = EventBusService.GetEventBus();
private readonly IConfiguration _configuration = ConfigurationService.GetConfiguration(Level.Roaming)
private readonly IExceptionHandler _exceptionHandler = ExceptionPolicy.GetHandler();
private readonly ITracer _tracer = TraceManager.GetDebugTracer();
}

最佳答案

将依赖项移出构造函数并不能解决问题,因为您没有降低类所具有的依赖项的数量,而且您仍然违反 Single Responsibility principle 的可能性很大。和 Open/Close principle ,导致您的代码难以测试、难以更改和难以维护。

相反,通常一个好的解决方案是将这些横切关注点从您的组件中提取出来,并将它们放入专门为该横切关注点量身定制的组件中,并且该组件包装原始组件。换句话说:创建 decorators .

这可能会迫使您更改类的设计,因为当您没有通用抽象来定义相关服务集时,您将不得不为每个抽象定义一个装饰器,这会导致大量代码重复,这在几乎所有情况下都是不好的。

因此,改为围绕 command/handlers 为您的系统建模和 query/handlers你会在一个更好的地方。您可以使用您定义一次并在所有地方重用的通用装饰器来装饰每个业务逻辑。这使您的系统保持干净,但仍然非常灵活。

关于c# - 构造函数注入(inject) (DI) 与静态工厂的横切问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25241851/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com