0

我需要使用 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();

从控制器 (ControllerClass) 中调用 ServiceClassA,如下所示

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

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

进行上述调用时,应根据条件(日期 > 31st March 2020 )调用 ServiceClassB 中的方法 B。为了实现这一点,我们的技术架构师认为 Autofac 的装饰器模式是对现有代码流影响不大的解决方案。

所以我对 ServiceClassA 注册进行了以下更改

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

完成上述步骤后,我被卡住了,不知道如何应用条件。在stackoverflow上检查了很多答案,以找到无法解决的解决方案。

4

1 回答 1

0

装饰器模式依赖于实现相同接口的两个类。不像你上面描述的那样。例如

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);
  } 
} 
于 2020-05-29T20:04:44.680 回答