代码之家  ›  专栏  ›  技术社区  ›  barteloma

如何在一个服务中为多个任务应用分离?

  •  0
  • barteloma  · 技术社区  · 3 年前

    我有一种服务方法,可以做很多事情。

    public Result DoSomething(){
        var queryResult = service.GetResult();
        
        SaveResultToRedis(queryResult);
        logger.Log($"this data saved in redis successfully {queryResult.Id}");
        
        AddSomethingToKafka(queryResult);
        logger.Log($"this data saved in kafka successfully {queryResult.Id}");
        
        logger.Log($"this data response is success {queryResult.Id}");
    }
    

    在本研究中,

    • 如果redis或kafka失败,请求-响应将失败。
    • 如果记录器服务失败,请求响应将失败。
    • 如果我把所有逻辑放在try-catch块中,代码就会显得很糟糕。

    哪种方法适用于本研究?是否有任何设计模式方法?

    0 回复  |  直到 3 年前
        1
  •  0
  •   StepUp    3 年前

    如果你想让你的方法更薄,那么试着应用 SOLID 规则。

    如果 DoSomething() 方法只是将数据保存到某个数据库或事件系统中,然后我们可以按数据库或事件系统将其分离。然而,代码示例只保存在两个地方,按存储区分开不是很好的选择。

    作为替代品,可以隐藏 logger.log 方法,并从中调用它 剂量测定() :

    private void ExecuteAndLog(Action action,  logger, string message)
    {
        action();
        logger.log(message);
    }
    

    完整代码如下所示:

    public void SaveToKafka(string str)
    {
    }
    
    public void SaveToRedis(string str)
    {
    }
    
    public void DoSomething() 
    {
        try
        {
            string s1 = "s1";
    
            ExecuteAndLog(() => SaveToKafka(s1), logger, "someMessage");
            ExecuteAndLog(() => SaveToRedis(s1), logger, "someMessage");
    
            logger.log("this data response is success");
        }
        catch (Exception)
        {
            throw;
        }        
    }
    
    
    private void ExecuteAndLog(Action action,  logger, string message)
    {
        action();
        logger.log(message);
    }