如何访问下游对象中的Logger对象?

时间:2019-04-23 18:40:25

标签: c# asp.net-core .net-core

为.NET Core Web项目考虑以下项目结构。

MyApp.UI项目(MVC)调用MyApp.BusinessRules调用MyApp.ServiceLayer调用MyApp.DbAccess项目调用任何对象。

在前端项目(MyApp.UI)中,我定义了logger。我想访问MyApp.DbAccess项目(或任何下游项目)中logger的此实例,而无需通过控制器操作的参数将其向上传递。我也无法在结构的深处进行依赖注入。

那么如何获得记录器的访问权限?

1 个答案:

答案 0 :(得分:2)

不应在UI层中定义记录器。这是一个跨领域的问题,因此您应该在外部库中定义它,并在所有需要记录的项目中引用它。

如果只想记录异常,则可以定义一个全局异常处理程序,让异常冒泡到UI层并将其记录在此处。示例here

如果您确实要一直传递Logger,则可以在方法中使用Action作为参数,并在要下游调用的方法调用中传递一个lambda。

    public class Logger
    {
        public string Message { get; set; }

        public void Log(string message)
        {
            Message = message;
        }
    }

    public class Business
    {
        public void DoWork(int id, Action<string> logAction)
        {
            if (id < 0)
            {
                logAction("The string is less than zero");
            }
        }
    }

通话代码

Logger logger = new Logger();
Business business = new Business();

business.DoWork(-1, (message) => logger.Log(message));