繁体   English   中英

简单注入器:在基础 class 中注入属性

[英]Simple Injector: Injecting a property in a base class

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

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 文档对此给出了非常清晰的解释。 基本选项是:

  • 使用RegisterInitializer注册初始化委托。
  • 覆盖简单注入器的PropertySelectionBehavior

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

这使您可以覆盖 Simple Injector 的PropertySelectionBehavior ,但是拥有一个基础 class 本身就闻起来像是违反了 SOLID 规定。 请看下面的文章 它描述了为什么拥有一个基础 class 可能是一个坏主意,并且文章为此提供了一个解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM