Декораторы и внедрение недвижимости в Autofac - PullRequest
5 голосов
/ 28 октября 2019

Я пытаюсь зарегистрировать декоратор для службы, которая использует внедрение свойств.
Когда я добавляю containerBuilder.RegisterDecorator<ServiceDecorator, IService>(), свойства больше не внедряются.
Я предполагаю, что Autofac вместо этого пытается внедрить его в декоратор. оригинального сервиса.

Я написал несколько тестов, чтобы продемонстрировать эту проблему. Есть сервисы и декоратор:

public interface IService
{
    bool NestedServiceIsNotNull();
}

public interface INestedService { }

public class Service : IService
{
    public INestedService NestedService { get; set; }

    public bool NestedServiceIsNotNull()
    {
        return NestedService != null;
    }
}

public class NestedService : INestedService { }

public class ServiceDecorator : IService
{
    private readonly IService _original;

    public ServiceDecorator(IService original)
    {
        _original = original;
    }

    public bool NestedServiceIsNotNull()
    {
        return _original.NestedServiceIsNotNull();
    }
}

И методы тестирования:

[TestMethod]
public void PropertyInjectedServiceShouldNotBeNull()
{
    var builder = new ContainerBuilder();
    builder.RegisterType<NestedService>().As<INestedService>();
    builder.RegisterType<Service>().As<IService>().PropertiesAutowired();
    var container = builder.Build();
    var service = container.Resolve<IService>();

    Assert.IsTrue(service.NestedServiceIsNotNull());
}

[TestMethod]
public void PropertyInjectedServiceShouldNotBeNullEvenIfDecoratorRegistered()
{
    var builder = new ContainerBuilder();
    builder.RegisterType<NestedService>().As<INestedService>();
    builder.RegisterType<Service>().As<IService>().PropertiesAutowired();
    // Here's the difference - decorating the service
    // causes the assertion to fail.
    builder.RegisterDecorator<ServiceDecorator, IService>();
    var container = builder.Build();
    var service = container.Resolve<IService>();

    Assert.IsTrue(service.NestedServiceIsNotNull());
}

Первый тест проходит, но второй не проходит по утверждению.

Это правильноПоведение?
Я работаю с устаревшим проектом, поэтому мне не следует изменять существующий код путем перемещения зависимостей в конструктор.
Есть ли способ решить эту проблему?

1 Ответ

0 голосов
/ 01 ноября 2019

Похоже ... вы нашли ошибку! Йоу! Я подал заявку от вашего имени здесь.

Однако еще не все потеряно - вы все равно можете использовать декораторы так, как вы хотите, вам просто придется использовать более старые менее-pretty Синтаксис декоратора Autofac, чтобы сделать это.

var builder = new ContainerBuilder();
builder.RegisterType<NestedService>().As<INestedService>();

// Decorating the service with the old syntax works.
builder.RegisterType<Service>().Named<IService>("service").PropertiesAutowired();
builder.RegisterDecorator<IService>((c, inner) => new ServiceDecorator(inner), fromKey: "service");

var container = builder.Build();
var service = container.Resolve<IService>();

Assert.True(service.NestedServiceIsNotNull());

Здесь больше документации о том, как работать с этим старым синтаксисом.

...