Ninject Cascading Constructor Arguments

时间:2012-04-13 13:23:49

标签: ninject

我有一个IRoleRepository类型,它接受一个构造函数参数“database”,它接受一种IDbRepository,它本身带有一个构造函数参数“ConnectionStringName”。我有一个依赖解析器,它有一个GetService方法,而下面的代码工作,我希望有更好的方法在绑定时间和使用Ninject 3.0获取时间。注意我可能有多个IDBRepository实例,每个实例都有自己的“ConnectionStringName”。

_repository = EngineContext.Current.GetService<IRoleRepository>(
                        new ConstructorArgument("database",
                            EngineContext.Current.GetService<IDbRepository>(
                                new ConstructorArgument(SystemConstants.ConnectionStringName, SystemConstants.ConfigurationDatabase))));

2 个答案:

答案 0 :(得分:2)

您可以使用WithConstructorArgument指定构造函数参数以及绑定。

kernel.Bind<IDbRepository>().To<DbRepository>()
      .WithConstructorArgument(
           SystemConstants.ConnectionStringName, 
           SystemConstants.ConfigurationDatabase);

或使用ToConstructor()

kernel.Bind<IDbRepository>().ToConstructor(
    x => new DbRepository(
             SystemConstants.ConfigurationDatabase, 
             x.Inject<ISomeOtherDependency>())

答案 1 :(得分:0)

好的,我相信我找到了我想要的东西:

在绑定时使用此功能:

            Bind<IDbRepository>().To<SqlServerRepository>()
            .WhenInjectedInto<IRoleRepository>()
            .WithConstructorArgument(SystemConstants.ConnectionStringName, SystemConstants.ConfigurationDatabase);

这允许我在Get time:

中使用它
_repository = EngineContext.Current.GetService<IRoleRepository>();

这当然意味着我现在可以根据注入IDbRepository的更具体的存储库来改变IDbRepository的构造函数参数。例如:

            Bind<IDbRepository>().To<SqlServerRepository>()
            .WhenInjectedInto<ITimerJobStore>()
                .WithConstructorArgument(SystemConstants.ConnectionStringName, SystemConstants.ConfigurationDatabase);

        Bind<ITimerJobStore>().To<TimerJobSqlStore>();