gpt4 book ai didi

c# - 构造函数字符串参数与 Ninject 的基于约定的绑定(bind)

转载 作者:太空狗 更新时间:2023-10-29 19:47:16 24 4
gpt4 key购买 nike

我在我的项目中使用 Ninject 作为 IoC 容器。我有以下类(class):

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

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

kernel.Bind<ISomeRepository>()
.To<SomeRepository>()
.WithConstructorArgument("someDatabaseConnectionString", connString);

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

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

最佳答案

看起来 Ninject 现在不可能实现那种基于约定的绑定(bind)。 I had a similar question here并且建议是制作一个接口(interface)来返回连接字符串并将其作为参数。不过,对于许多不同的连接字符串来说,这可能很乏味。

这只是一个想法,但你能不能有一个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 容器的优势。

关于c# - 构造函数字符串参数与 Ninject 的基于约定的绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12244586/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com