Autofac:如何将对要解析的组件的引用传递给其依赖项之一?

时间:2011-02-09 13:56:44

标签: ioc-container autofac

以下内容:

public class AClass
{
  public ADependent Dependent { get; set; }
}
public class ADependent
{
  public ADependent(AClass ownerValue) {}
}

以下注册......

builder.RegisterType<AClass>().PropertiesAutowired().InstancePerDependency();
builder.RegisterType<ADependent>().PropertiesAutowired().InstancePerDependency();

当我解析一个AClass时,如何确保'ownerValue'是要解析的AClass的实例,而不是另一个实例? THX

关注

上面的示例并没有真正正确地解决问题,这是在扫描时注册时如何连接ADependent ...例如

public class AClass : IAClass
{
  public IADependent Dependent { get; set; }
}
public class ADependent : IADependent
{
  public ADependent(IAClass ownerValue) {}
}

// registrations...

  builder.RegisterAssemblyTypes(assemblies)
    .AssignableTo<IAClass>()
    .As<IAClass>()
    .InstancePerDependency()
    .PropertiesAutowired();

  builder.RegisterAssemblyTypes(assemblies)
    .AssignableTo<IADependent>()
    .As<IADependent>()
    .InstancePerDependency()
    .PropertiesAutowired();

我正在寻找的功能实际上是另一种关系类型,如

public class ADependent : IADependent
{
  public ADependent(OwnedBy<IAClass> ownerValue) {}
}

OwnedBy表示ownerValue是导致创建ADependent的实例。这样的事情有意义吗?它肯定会使UI组件的连接变得轻而易举。

2 个答案:

答案 0 :(得分:1)

为了扩展Steven的方法,您甚至可以Resolve()第二个类,将第一个实例作为参数传递:

builder.RegisterType<ADependent>();
builder.Register<AClass>(c =>
{
   var a = new AClass();
   a.Dependent = c.Resolve<ADependent>(TypedParameter.From(a));
   return a;
});

答案 1 :(得分:0)

你可以注册一个lambda来做这个伎俩:

builder.Register<AClass>(_ =>
{
    var a = new AClass();
    a.Dependent = new ADependent(a);
    return a;
});