Ninject - 带参数/实体框架连接字符串的绑定构造函数

时间:2011-07-21 12:16:10

标签: asp.net-mvc ioc-container ninject

请原谅我的无知,但我对IOC和NinJect很新。我已经搜索了很高和最低的易于理解的解决方案,但到目前为止他们都没有找到我。

到目前为止,我有以下内容,所有工作都按预期进行:

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

MyEntityFrameWorkRepository然后通过在app / web.config中声明的连接字符串创建自己的EF DbContext:

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 个答案:

答案 0 :(得分:23)

您可以使用.WithConstructorArgument()方法指定构造函数参数。第一个参数应该是构造函数参数的名称。

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

}

答案 1 :(得分:5)

Ninject的新版本允许摆脱绑定定义中的魔术字符串。像这样:

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

对于涉及泛型类型的绑定(例如,绑定ISomeService<T>SomeService<T>并且应该一次对所有可能的类型执行绑定),不能使用ToConstructor(需要新的表达式) ,所以WithConstructorArgument仍然是最简单的方法。 E.g:

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