1 回答
TA贡献1859条经验 获得超6个赞
这是否意味着我需要约60多个抽象工厂才能IQueueProcessor在工作线程中实例化我?
在最坏的情况下,可能需要这样做。当所有依赖项都必须具有瞬态生存期时(例如,它们不是线程安全的),可能会发生这种情况。
但是,在最佳情况下,所有这些依赖项都可能具有Singleton生存期,这可能适用于线程安全的依赖项。在这种情况下,不需要内部工厂:
public class QueueProcessorFactory : IQueueProcessorFactory
{
private readonly IEventTriggerQueuedEventService _qeueuedEventService;
private readonly ILogger _logger;
private readonly IEventTriggerActionGroupLogService _eventTriggerActionGroupLogService;
// etc...
public QueueProcessorFactory(
IEventTriggerQueuedEventService qeueuedEventService,
ILogger logger,
IEventTriggerActionGroupLogService eventTriggerActionGroupLogService,
/* etc... */)
{
_qeueuedEventService = qeueuedEventService;
_logger = logger;
_eventTriggerActionGroupLogService = eventTriggerActionGroupLogService;
// etc...
}
public IQueueProcessor Create()
{
return new QueueProcessor(
_qeueuedEventService,
_logger,
_eventTriggerActionGroupLogService,
/* etc... */);
}
}
实际上,您可能需要将一些Transient依赖项(需要工厂)与一些Singleton依赖项混合在一起。
如果最终需要数十家工厂,则可以考虑使用DI容器。其中一些可以自动生成工厂接口的实现-您只需提供他们必须实现的接口即可。
此外,您不必为每个依赖项定义一个接口,而是可以考虑使用一个通用接口,例如:
public interface IFactory<T>
{
T Create();
}
再次,一些DI容器在那里支持此类工厂。您也可以考虑完全放弃接口,而只使用像这样的委托Func<T>。
但是,除非情况特殊,否则我不建议您使用DI容器,而是推荐Pure DI。当您使用DI容器时,您将失去编译时的安全性,我倾向于认为这不值得取舍。毕竟,编程的瓶颈很少是您的打字速度。
- 1 回答
- 0 关注
- 156 浏览
添加回答
举报