8

我在我的项目中使用 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”文章(“原语约定”部分)中有更详细的描述。示例中使用了 Castle Windsor 容器。

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

4

1 回答 1

1

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 容器一起使用的优势。

于 2012-09-21T16:57:32.377 回答