Как реализовать шаблон декоратора с Autofa c для сценария ниже - PullRequest
0 голосов
/ 29 мая 2020

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

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

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. Для достижения этой цели наш технический архитектор считает, что шаблон декоратора с Autofa c - это решение, мало влияющее на существующий поток кода.

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

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

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

1 Ответ

0 голосов
/ 29 мая 2020

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

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);
  } 
} 
...