3

我想基於使用ninject的url動態指定連接字符串。Ninject - 根據子域動態指定連接字符串

我正在使用使用webActivator的ninject.mvc nuget包。

我的代碼如下:

我注:

kernel.Bind<IUnitOfWork>().To<UnitOfWork>() 
    .WithConstructorArgument("connectionString", MvcApplication.GetConnectionStringName()); 

我的Global.asax

private static HttpContext _context; 
public static string GetConnectionStringName() { 
    var subDomain = String.Empty; 

    if (_context != null) { 
    subDomain = _context.Request.Url.SubDomain(); 
    } 

    return String.Format("{0}ConnectionString", subDomain); 
} 

的問題是_context(這是在我的Application_BeginRequest設置)總是null,因爲WebActivator在application_start之前運行。

當需要IUnitOfWork而不是在應用程序啓動時,ninject是否可以指定呼叫MvcApplication.GetConnectionStringName()

有沒有更好的方法來做我在做什麼?

謝謝

回答

4

您應該使用這樣的Ninject綁定。

kernel.Bind<IUnitOfWork>().To<UnitOfWork>() 
    .WithConstructorArgument("connectionString", context => MvcApplication.GetConnectionStringName()); 

注意context這裏的類型Ninject的IContext等具有無關HttpContext

無論如何,我認爲你的做法是適合這個。

有時(特別是當有多個相關參數需要注入時),我更喜歡爲配置創建接口和特定實現,並讓它們通過標準綁定注入。

public interface IUnitOfWorkConfiguration { 
    string ConnectionString { get; } 
} 

public class AppConfigUnitOfWorkConfiguration : IUnitOfWorkConfiguration { 
    public string ConnectionString { get { ... } } 
} 

public class UnitOfWork { 
    public UnitOfWork(IUnitOfWorkConfiguration configuration) { 
    } 
} 

Bind<IUnitOfWorkConfiguration>().To<AppConfigUnitOfWorkConfiguration>(); 

使用此方法可避免將參數名稱指定爲字符串文字。

有關使用HttpContext的更多注意事項。由於線程安全問題,我不建議使用它。您應該將您的私有靜態字段_context標記爲[ThreadStatic]屬性,或者作爲更好的選擇,只需在任何地方使用HttpContext.Current即可。