Как реализовать шаблон декоратора с 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);
}
}