Свойство одного класса передается в качестве параметра конструктору другого класса. Как решить эту проблему с Autofac? - PullRequest
0 голосов
/ 09 октября 2019

Я новичок в Autofac, и это сценарий моей проблемы:

У меня есть 2 класса, оба из них являются синглетонами.

У одного из них есть публичное свойство, например.

public class ClassWithProperty
{
  public string SomeProperty { get; set; }
}

и второй класс имеет конструктор, который должен взять свойство из первого класса в качестве параметра:

public class ClassWithConstructor
  {
    private string _someParameter;

    public ClassWithConstructor(string someParameter)
    {
      _someParameter = someParameter;
    }
  }

без Autofac. Я могу просто сделать это так:

var classWithProperty = new ClassWithProperty();
var classWithConstructor = new ClassWithConstructor(classWithProperty.SomeProperty);

Я не могу решить эту проблему с Autofac и найти решение здесь или в Google. Что я делаю:

var builder = new ContainerBuilder();

builder.RegisterType<ClassWithProperty>().InstancePerLifetimeScope();
builder.RegisterType<ClassWithConstructor>()
    .WithParameter() // what should be done here to pass exactly ClassWithProperty.SomeProperty here?
    .InstancePerLifetimeScope();
var container = builder.Build();

конечно, это упрощенный сценарий, просто чтобы показать мою проблему. В реальном сценарии я передаю TreeList из одной формы в другой класс представления и работаю именно с этим TreeList.

1 Ответ

1 голос
/ 09 октября 2019

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

var builder = new ContainerBuilder();

builder.RegisterType<ClassWithProperty>()
       .InstancePerLifetimeScope();
builder.Register(c => new ClassWithConstructor(c.Resolve<ClassWithProperty>().SomeProperty))
       .InstancePerLifetimeScope(); 

или

var builder = new ContainerBuilder();

builder.RegisterType<ClassWithProperty>()
       .InstancePerLifetimeScope();
builder.Register<ClassWithConstructor>()
       .WithParameter(new ResolvedParameter(
              (pi, ctx) => pi.ParameterType == typeof(string) && pi.Name == "someParameter",
              (pi, ctx) => "sectionName"))
       .InstancePerLifetimeScope(); 
...