【问题标题】:How to implement decorator Pattern with Autofac for the below scenario如何在以下场景中使用 Autofac 实现装饰器模式
【发布时间】:2020-05-29 14:45:58
【问题描述】:

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

进行上述调用时,应根据条件(日期 > 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上检查了很多答案,以找到无法解决的解决方案。

【问题讨论】:

  • 这不是真正值得回答的,所以这里作为评论。如果我是你,我会看看拦截器:autofaccn.readthedocs.io/en/latest/advanced/interceptors.html。你可以让你的拦截器包含逻辑来决定应该调用这两个方法中的哪一个,或者应该解析两个服务中的哪一个。

标签: c# asp.net-mvc autofac decorator-pattern


【解决方案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);
  } 
} 

【讨论】:

    猜你喜欢
    • 2020-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-16
    • 1970-01-01
    • 2016-02-24
    • 1970-01-01
    相关资源
    最近更新 更多