Simple Injector:在基类中注入属性

本文关键字:注入 属性 基类 Injector Simple | 更新日期: 2023-09-27 17:58:16

几个星期以来,我一直在使用Simple Injector依赖性注入容器,并取得了巨大成功。我喜欢配置它的简单方式。但现在我有一个不知道如何配置的设计。我有一个基类,其中派生了许多类型,我想将依赖项注入基类的属性,但不必为每个派生类配置它。我尝试使用属性来实现这一点,但SimpleInjector不支持属性。这是我设计的精简版。

public interface Handler<TMessage> where TMessage : Message
{
    void Handle(TMessage message);
}
public abstract class BaseHandler
{
    // This property I want to inject
    public HandlerContext Context { get; set; }
}
// Derived type
public class NotifyCustomerHandler : BaseHandler,
    Handler<NotifyCustomerMessage>
{
    public NotifyCustomerHandler(SomeDependency dependency)
    {
    }
    public void Handle(NotifyCustomerMessage message)
    {
    }
}

我的配置现在看起来是这样的:

container.Register<HandlerContext, AspHandlerContext>();
container.Register<Handler<NotifyCustomerMessage>, NotifyCustomerHandler>();
// many other Handler<T> lines here

如何在BaseHandler中注入属性?

提前感谢您的帮助。

Simple Injector:在基类中注入属性

关于属性注入的Simple Injector文档对此给出了非常清晰的解释。基本选项包括:
  • 使用RegisterInitializer注册初始化委托
  • 覆盖简单注入器的PropertySelectionBehavior

正如文档所解释的,不建议使用RegisterInitializer对依赖项进行属性注入;仅针对配置值。

这让您可以重写SimpleInjector的PropertySelectionBehavior,但拥有基类本身闻起来像是违反了SOLID。请看下面的文章。它描述了为什么有一个基类可能是一个坏主意,文章提出了一个解决方案。