Ninject - связывающие конструкторы с аргументами / строка подключения Entity Framework - PullRequest
19 голосов
/ 21 июля 2011

Пожалуйста, прости мое невежество, но я очень новичок в МОК и NinJect.Я искал высокие и низкие для легко понятных решений, но до сих пор они ускользали от меня.

Пока у меня есть следующее, и все работает как ожидалось:

private class StandardModule : NinjectModule
    {
      public override void Load()
      {
        Bind<ILog>().To<NLogLogger>();    // Use NLog
        Bind<IMyEntityFrameWorkRepository().To<MyEntityFrameWorkRepository>();
      }
    }

MyEntityFrameWorkRepository затем создает егособственный EF DbContext через строку подключения, объявленную в app / web.config:

public class MyDbContext : DbContext
{
   public MyDbContext() : base("MyAppConfig")
   {
   }
   ........
}

ОДНАКО !!Моя цель примерно такая: я понимаю, что этот синтаксис "бессмыслица" (и я думаю , возможно, мне придется и IOC MyDbConext тоже), но я надеюсь, что "псевдокод" передает мое желание:

private class StandardModule : NinjectModule
{
  public override void Load()
  {
    Bind<ILog>().To<NLogLogger>();    // Use NLog

    string mySqlConnectionString = MyApp.GetCommandLineArgument("sqlconn"); // "Data Source=..."
    Bind<IMyEntityFrameWorkRepository().To<MyEntityFrameWorkRepository>(mySqlConnectionString);
  }
}

.................

public class MyDbContext : DbContext
{
   public MyDbContext( string sqlConnectionString) :
      base(sqlConnectionString) // will accept a standard SQL connection string
   {
   }
   ........
}

Я был бы очень признателен за отзывы от экспертов IOC / NinJect, поскольку я уверен, что любой «шаблон» может быть очень полезен в других сценариях.

Ответы [ 2 ]

23 голосов
/ 21 июля 2011

Вы можете использовать метод .WithConstructorArgument() для указания аргументов конструктора. Первым аргументом должно быть имя параметра конструктора.

public class StandardModule : NinjectModule
{
    public override void Load()
    {
        string connectionString = "...";
        Bind<IMyEntityFrameWorkRepository().To<MyEntityFrameWorkRepository>()
            .WithConstructorArgument("sqlConnectionString", connectionString);
    }

}

5 голосов
/ 23 сентября 2016

Более новые версии Ninject позволяют избавиться от волшебных строк в определении привязки.Примерно так:

public class StandardModule : NinjectModule
{
    public override void Load()
    {
        string connectionString = "...";
        Bind<IMyEntityFrameWorkRepository()
            .ToConstructor(_ => new MyEntityFrameWorkRepository(connectionString);
    }
}

Для привязок, включающих универсальные типы (например, связывание ISomeService<T> с SomeService<T> и привязка должна выполняться для всех возможных типов одновременно), ToConstructor использовать нельзя (новыйвыражение требуется), поэтому WithConstructorArgument остается самым простым подходом.Например:

Bind(typeof(ISomeService<>))
    .To(typeof(SomeService<>))
    .WithConstructorArgument("someParam", "someValue");
...