1

我有一个类型 IRoleRepository,它接受一个构造函数参数“数据库”,它接受一个 IDbRepository 类型,它本身接受一个构造函数参数“ConnectionStringName”。我有一个依赖解析器,它有一个 GetService 方法,虽然下面的代码有效,但我希望在 Bind 时间而不是在 Ninject 3.0 的 Get 时间有更好的方法来做到这一点。注意我可能有多个 IDBRepository 实例,每个实例都有自己的“ConnectionStringName”。

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

2 回答 2

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>())
于 2012-04-13T13:48:01.227 回答
0

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

通过在绑定时间使用它:

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

这使我可以在 Get 时间使用它:

_repository = EngineContext.Current.GetService<IRoleRepository>();

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

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

        Bind<ITimerJobStore>().To<TimerJobSqlStore>();
于 2012-04-13T14:08:20.563 回答