【问题标题】:Autofac: how do I pass a reference to the component being resolved to one of its dependents?Autofac:如何将要解析的组件的引用传递给它的依赖项之一?
【发布时间】:2011-02-09 13:56:43
【问题描述】:

以下内容:

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 的实例,而不是另一个实例?谢谢

关注

上面的例子并没有真正正确地捕捉到问题,例如扫描时注册时如何连接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 组件的连接变得轻而易举。

【问题讨论】:

    标签: ioc-container autofac


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢。但我不喜欢这样的原因是它失去了自动装配,这对我来说是 IOC 的最大好处。另外,扫描程序集时我会怎么做?我已经编辑了我的问题,使示例更接近我真正的问题。
    • 嗨,Tom - 如果您觉得需要,可以将此方法构建到您的扫描配置中 - 只需在 OnActivating() 事件中分配属性,将实例作为参数传递。更多代码,您需要弄清楚如何标记属性(可能使用标记类型)而不是 ctor 参数。干杯,尼克。
    【解决方案2】:

    您可以注册一个 lambda 来解决问题:

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

    【讨论】:

    • 同意。但是扫描时我该怎么做呢?我已经进一步编辑了我的问题。
    猜你喜欢
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-08
    • 2021-01-02
    • 1970-01-01
    相关资源
    最近更新 更多