Ninject — динамическое указание строки подключения на основе поддомена

Я пытаюсь указать строку подключения динамически на основе URL-адреса, используя ninject.

Я использую пакет ninject.mvc nuget, который использует webActivator.

Мой код выглядит следующим образом:

моя инъекция:

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

мой глобальный.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) всегда равен нулю, потому что WebActivator запускается до application_start.

Можно ли в ninject указать вызов MvcApplication.GetConnectionStringName(), когда требуется IUnitOfWork, а не при запуске приложения?

Есть ли лучший подход к тому, что я делаю?

Спасибо


person lancscoder    schedule 11.08.2011    source источник


Ответы (1)


Вы должны использовать привязку Ninject следующим образом.

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

Обратите внимание, что context здесь относится к типу IContext Ninject и поэтому не имеет ничего общего с 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.

person gusztav.varga.dr    schedule 11.08.2011