使用 Autofac 将组件 属性 注入到另一个组件的构造函数参数中

Inject a component property into another component's constructor parameter with Autofac

使用 Autofac IoC 容器,假设有以下场景:

public interface IHaveASpecialProperty
{
  SpecialType SpecialProperty { get; }
}

public class HaveASpecialPropertyImpl : IHaveASpecialProperty
{
  // implementation
}

public class SomeComponent
{
  public SomeComponent(SpecialType special)
  {
    _special = special;

    // rest of construction
  }

  private readonly SpecialType _special;

  // implementation: do something with _special
}

// in composition root:

containerBuilder.RegisterType<HaveASpecialPropertyImpl>
  .As<IHaveASpecialProperty>();

containerBuilder.RegisterType<>(SomeComponent);

有没有办法在 Autofac 容器中注册 HaveASpecialPropertyImpl 类型作为 SpecialType 实例的一种提供者/工厂?

我目前拥有的是这种经典方法:

public class SomeComponent
{
  public SomeComponent(IHaveASpecialProperty specialProvider)
  {
    _special = specialProvider.SpecialProperty;

    // rest of construction
  }

  private readonly SpecialType _special;

  // implementation: do something with _special
}

原理基本上与得墨忒耳法则有关:specialProvider只是用来抓取一个SpecialType实例,而不是实际依赖SomeComponent 需要和使用,因此只注入 SpecialType 实例似乎是合理的,而不考虑 SomeComponent 该实例的来源。

PS:我读过关于 Delegate Factories 的文章,不确定那是否是(唯一的?)方法。

您可以注册一个代表:

builder.Register(c => c.Resolve<IHaveASpecialProperty>().SpecialProperty)
       .As<ISpecialType>(); 

使用此注册,每次您将解析一个 ISpecialType Autofac 将解析一个 IHaveASpecialProperty 和 return SpecialProperty 属性 值为 ISpecialType.