为.NET Core Web项目考虑以下项目结构。
MyApp.UI项目(MVC)调用MyApp.BusinessRules调用MyApp.ServiceLayer调用MyApp.DbAccess项目调用任何对象。
在前端项目(MyApp.UI)中,我定义了logger
。我想访问MyApp.DbAccess项目(或任何下游项目)中logger
的此实例,而无需通过控制器操作的参数将其向上传递。我也无法在结构的深处进行依赖注入。
那么如何获得记录器的访问权限?
答案 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));