Ninject - динамическое указание строки подключения на основе поддоменов - PullRequest
3 голосов
/ 11 августа 2011

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

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

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

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

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

my 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) всегда равен нулю, поскольку WebActivator запускается до application_start.указать для вызова MvcApplication.GetConnectionStringName() когда требуется IUnitOfWork, а не при запуске приложения?

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

Спасибо

1 Ответ

4 голосов
/ 11 августа 2011

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

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

Обратите внимание, что context здесь относится к типу Ninject IContext и поэтому не имеет ничего общего с HttpContext.

* 1008.* В любом случае, я думаю, что ваш подход подходит для этого.

Иногда (особенно, когда нужно ввести несколько связанных параметров), я предпочитаю создавать интерфейс и конкретные реализации для конфигураций и позволять им вводить стандартные привязки, подобные этой.

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 везде.

...