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); 
} 

問題は(私のApplication_BeginRequestに設定されている)_contextが常にありますWebActivatorがapplication_startより前に実行されるため、nullです。

アプリケーション起動時ではなくIUnitOfWorkが必要な場合は、ninjectでMvcApplication.GetConnectionStringName()を呼び出すことはできますか?

私がやっていることに対してより良いアプローチがありますか?

ありがとう

答えて

4

このようなNinjectバインディングを使用する必要があります。

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

ここcontextはタイプNinjectのIContextのものであり、そのHttpContextとは何の関係もないことに注意してください。

とにかく私はあなたがこれに適していると思います。 (注入されるべき複数の関連パラメータがある特に)時には

Iは、構成のためのインターフェースと特定の実装を作成し、それらはこのような標準的なバインディングによって注入させ好みます。

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をもう1つご使用ください。スレッドの安全性の問題から、この方法を使用することはお勧めしません。あなたはプライベートな静的フィールド_context[ThreadStatic]アトリビュートをマークするか、より良い選択肢としてHttpContext.Currentをどこにでも使用する必要があります。

関連する問題