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

时间:2015-06-23 21:23:37

标签: c# dependency-injection 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
}

基本原理与Demeter法基本相关:specialProvider仅用于获取SpecialType实例,而SomeComponent实例需要{{>>实际依赖关系。 {1}},所以只注入SpecialType个实例似乎是合理的,而不关心SomeComponent该实例的来源。

PS:我读过关于Delegate Factories的内容,不确定这是否是(仅限?)方式。

1 个答案:

答案 0 :(得分:1)

您可以注册代表:

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

使用此注册,每次您解析ISpecialType Autofac 将解析IHaveASpecialProperty并将SpecialProperty属性值返回为ISpecialType