我有一个WebAPI,它接收一个ID作为请求的一部分。我实例化一个记录器,它将此ID添加为日志的一部分。
public class A
{
public void method(string log, string ID)
{
Logger.Log(log,ID); //A static reference to the Logger
}
}
但是,这种方法要求我将ID作为参数传递给每个方法,这可能会使代码看起来有点麻烦。
methodA(parameters,ID);
public void methodA(someParameters, string ID)
{
methodB(params,ID);
Logger.Log(log,ID);
}
public void methodB(someParameters, string ID)
{
methodB(params,ID);
Logger.Log(log,ID);
}
...
...
但是,我也不能将它变为静态变量,因为每个请求都有一个单独的ID。有什么办法可以让代码变得更好吗?比如,定义一个可以在所有项目中访问的共享变量。或者DependencyInjection是唯一的方法吗?
答案 0 :(得分:3)
依赖注入不是唯一的方法,但它是正确的方式。
定义日志记录服务:
public interface ILoggingService
{
void Log(string log, string id);
void Log(string log);
}
public class LoggingService : ILoggingService
{
private string id;
public void Log(string log, string id)
{
this.id = id;
}
public void Log(string log) => Log(log, id);
}
将其注入请求范围(仅使用Ninject):
Bind<ILoggingService>().To<LoggingService>().InScope(_ => _.Request);
答案 1 :(得分:1)
实际上,REST的原则之一就是无国籍。也就是说它不应该存储任何数据以便在请求之间共享。你在问题中提到的方法是正确的。但是如果你真的想这样做,你可以在第一个请求到来时创建一个cookie,其余的请求将有cookie,你可以从那里获取id。