Autofac: как передать ссылку на разрешаемый компонент одному из его зависимых? - PullRequest
1 голос
/ 09 февраля 2011

Со следующим:

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.Имеет ли что-то подобное смысл?Это, безусловно, сделает подключение компонентов пользовательского интерфейса быстрым.

Ответы [ 2 ]

1 голос
/ 10 февраля 2011

Чтобы расширить подход Стивена, вы можете даже Resolve() второй класс, передав первый экземпляр в качестве параметра:

builder.RegisterType<ADependent>();
builder.Register<AClass>(c =>
{
   var a = new AClass();
   a.Dependent = c.Resolve<ADependent>(TypedParameter.From(a));
   return a;
});
0 голосов
/ 09 февраля 2011

Вы можете зарегистрировать лямбду, чтобы сделать трюк:

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