Я пытаюсь зарегистрировать декоратор для службы, которая использует внедрение свойств.
Когда я добавляю 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());
}
Первый тест проходит, но второй не проходит по утверждению.
Это правильноПоведение?
Я работаю с устаревшим проектом, поэтому мне не следует изменять существующий код путем перемещения зависимостей в конструктор.
Есть ли способ решить эту проблему?