基于约定的构造函数字符串参数与Ninject的绑定

我在我的项目中使用Ninject作为IoC容器。 我有以下课程:

public class SomeRepository:ISomeRepository { public SomeRepository(string someDatabaseConnectionString) { // some code here.. } } 

在我的应用程序设置文件中,我有一个名为“someDatabase”的连接字符串。 默认情况下,应该添加以下配置,以便将此连接字符串注入构造函数:

 kernel.Bind() .To() .WithConstructorArgument("someDatabaseConnectionString", connString); 

但我想实现这种字符串的传统绑定。 名称以“ConnectionString”结尾的字符串类型的所有构造函数参数的值应从应用程序的connectionStrings配置部分获取并自动注入。 我也想为appSettings部分实现类似的约定。 这种方法在Mark Seeman的“Primitive Dependencies”一文(“基元的约定”一节)中有更详细的描述。 在示例中使用Castle Windsor容器。

是否可以使用Ninject实现此类约定,最好的方法是什么? 我已经尝试过ninject.extensions.conventions但似乎它没有这样的function,是吗?

Ninject现在看起来不像那种基于约定的绑定。 我在这里有一个类似的问题 ,建议是创建一个接口来返回连接字符串并将其作为参数。 但是,对于许多不同的连接字符串来说,这可能是乏味的。

这只是一个想法,但是你有一个IConnectionStringProvider可以使用reflection来获取T的名称并以这种方式查找应用程序设置吗? 也许是这样的:

 public class ConnectionStringProvider : IConnectionStringProvider { public string Value { // use reflection to get name of T // look up connection string based on the name // return the connection string } } ... public class SomeRepository:ISomeRepository { public SomeRepository(IConnectionStringProvider connectionStringProvider) { this.connectionString = connectionStringProvider.Value; } } 

此外,如果这不起作用,您可以使用非通用的IConnectionStringProvider ,它将类型作为参数:

 public class ConnectionStringProvider : IConnectionStringProvider { public string GetValueFor(Type type) { // use reflection to get name of type // look up connection string based on the name // return the connection string } } ... public class SomeRepository:ISomeRepository { public SomeRepository(IConnectionStringProvider connectionStringProvider) { this.connectionString = connectionStringProvider.GetValueFor(this.GetType()); } } 

如果其中一个工作,那么他们将具有它们应该与任何DI容器一起工作的优点。