在WebAPI中跨项目共享特定于实例的变量

时间:2016-11-24 08:04:07

标签: c# asp.net-web-api

我有一个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是唯一的方法吗?

2 个答案:

答案 0 :(得分:3)

依赖注入不是唯一的方法,但它是正确的方式。

  1. 定义日志记录服务:

    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);
    }
    
  2. 将其注入请求范围(仅使用Ninject):

    Bind<ILoggingService>().To<LoggingService>().InScope(_ => _.Request);
    

答案 1 :(得分:1)

实际上,REST的原则之一就是无国籍。也就是说它不应该存储任何数据以便在请求之间共享。你在问题中提到的方法是正确的。但是如果你真的想这样做,你可以在第一个请求到来时创建一个cookie,其余的请求将有cookie,你可以从那里获取id。

https://www.asp.net/web-api/overview/advanced/http-cookies