Как реализовать шаблон декоратора с Autofac для сценария ниже

Мне нужно реализовать шаблон декоратора с помощью Autofac.

У меня есть два класса / сервиса с собственной реализацией. Теперь в зависимости от условия мне нужно иметь возможность динамически вызывать любой из классов службы для получения данных.

ServiceClassA : InterfaceA 
{
   // Method A
}

ServiceClassB : InterfaceB
{
  //Method B
}

В настоящее время я зарегистрировал ServiceClassA и ServiceClassB, как показано ниже

builder.RegisterType<ServiceClassA>()
       .WithParameter( new resolvedParameter())
       .As<InterfaceA>()
       .InstancePerLifeTimeScope();

builder
       .RegisterType<ServiceClassB>()
       .As<InterfaceB>()
       .InstancePerLifetimeScope();

ServiceClassA вызывается из контроллера (ControllerClass), как показано ниже.

ControllerClass : Controller 
{
  private readonly InterfaceA _serviceClassA;
  public Controller(Interface serviceClassA)
  {
    _serviceClassA = serviceClassA;
  }

  public ActionResult Get()
  {
   var obj = _serviceClassA.MethodA();
  }
}

Когда выполняется вышеуказанный вызов, на основе условия (дата> 31 марта 2020 г.) должен быть вызван метод B в ServiceClassB. Для достижения этой цели наш технический архитектор считает, что шаблон декоратора с Autofac - это решение, мало влияющее на существующий поток кода.

Итак, я внес следующие изменения для регистрации ServiceClassA

builder.RegisterType<ServiceClassA>()
           .WithParameter( new resolvedParameter())
           .Named<InterfaceA>("serviceClassA")
           .InstancePerLifeTimeScope();
 builder.RegisterDecorator<InterfaceA>(
            (c,serviceClassA) => ServiceDecorator(), 
            "serviceClassA");

после вышеперечисленных шагов я застрял, не знаю, где применить условие. Проверил много ответов на stackru, чтобы найти решение, которое не может.

1 ответ

Шаблон декоратора полагается на оба класса, реализующие один и тот же интерфейс. Не так, как вы описали выше. НАПРИМЕР

public interface IProductRepository
{
  Product Get(int id);
}

public class ProductRepository : IProductRepository
{
  public Product Get(string id)
  {
    // logic to get product
  } 
}

public class LoggingProductRepository : IProductRepository
{
  private IProductRepository _productRepository;
  private ILog _logger;

  public LoggingProductRepository(IProductRepository productRepository, ILog logger) 
  {
    _productRepository = productRepository;
    _logger = logger;
  } 

  public Product Get(string id) 
  {
     _logger.Log("something");
     return _productRepository.Get(id);
  } 
} 
Другие вопросы по тегам