我在项目中使用Ninject作为IoC容器。我有以下课程:
public class SomeRepository:ISomeRepository
{
public SomeRepository(string someDatabaseConnectionString)
{
// some code here..
}
}
在我的应用程序设置文件中,我有一个名为"someDatabase"的连接字符串。默认情况下,应该添加以下配置,以便将此连接字符串注入构造函数:
kernel.Bind<ISomeRepository>()
.To<SomeRepository>()
.WithConstructorArgument("someDatabaseConnectionString", connString);
但我想实现这种字符串的基于常规的绑定。名称以"ConnectionString"结尾的字符串类型的所有构造函数参数的值应取自应用程序的connectionStrings配置部分,并自动注入。我也想为appSettings部分实现类似的约定。这种方法在Mark Seeman的"Primitive Dependencies"一文("Conventions for Primitive"一节)中有更详细的描述。示例中使用了温莎城堡集装箱。
有可能使用Ninject实现这样的约定吗?最好的方法是什么?我已经尝试过ninject.extensions.conventions,但它似乎没有这样的功能,是吗?
现在Ninject似乎不可能实现这种基于约定的绑定。我在这里有一个类似的问题,建议制作一个接口来返回连接字符串,并将其作为参数。不过,对于许多不同的连接字符串来说,这可能是乏味的。
这只是一个想法,但你能有一个IConnectionStringProvider<T>
吗可以使用反射来获得T的名称,并以这种方式查找应用程序设置?可能是这样的:
public class ConnectionStringProvider<T> : IConnectionStringProvider<T>
{
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<SomeRepository> 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容器一起工作。