0

問題: 我有webapi serviss,幾乎每個用戶都有自己的數據庫實例進行連接。所以我必須爲每個用戶設置不同的connection string。要識別用戶,我會將特定的令牌傳遞到標題中。關於這個令牌,系統構建和設置differenct連接字符串到數據訪問層的構造函數(在這種情況下訂單)如何根據請求標題設置參數到Ninject聯編程序

問: 是否可以傳遞參數Ninject或請求頭對於任何種類的IoC粘結劑?

IOrders _orders; 
    public HomeController(IOrders order) 
    { 
     _orders = order; 
    } 

這是一個Ninject綁定,但正如您所猜測的,HttpContext.Current爲空。

private static void RegisterServices(IKernel kernel) 
    { 
     var some_value = HttpContext.Current.Request.Headers.GetValues("Token"); 
     kernel.Bind<IOrders>() 
      .To<Orders>() 
      .WhenInjectedInto<HomeController>() 
      .WithConstructorArgument("Token", some_value); 
    } 

也許有許多優雅的方式來做到這一點使用Controller Factory

回答

1

我會創建一個服務類,爲你做這個查找。然後將此服務注入訂單實施。

public interface IRequestContext { 
    string ConnectionString {get;} 
} 

public class HttpHeaderRequestContext : IRequestContext { 
    public string ConnectionString { 
     get { 
      var token = HttpContext.Current.Request.Headers.GetValues("Token"); 
      // .. lookup conn string based on token 
     } 
    } 
} 

public class Orders : IOrders { 
    public Orders(IRequestContext ctx) { 
     // create new connection w/ ctx.ConnectionString 
    } 
} 

使用此方法時,將頭部和連接字符串的查找從實現中抽象出來。這使得測試變得更容易,並且如果需要的話,可以用另一種獲得連接字符串的方法來更換。

0

實施戴夫方法後,我發現我可以通過餵養HttpContext.Current解決這個connection string注入Ninject像這樣結合:

private static void RegisterServices(IKernel kernel) 
    { 
     kernel.Bind<IOrders>() 
      .To<Orders>() 
     .WhenInjectedInto<HomeController>() 
     .WithConstructorArgument("smth", x => { 
      var token = HttpContext.Current.Request.Headers.Get("Token"); 
      var _db = new SomeDataCxt(); 
      var connStr = _db.DbStringRepository.GetByToken(token); 
      return connStr; 
     }); 
    } 
相關問題