Ninject Providers:解决依赖关系的正确方法是什么

Ninject Providers: what is the correct way to resolve dependencies

在我的应用程序中,我可以按名称注册不同的数据源。这些数据源每个都需要一些 string 属性,以及一组其他依赖项,但在其他方面是相同的,因此采用一些不同的标准实现。

为了在请求时构造每个数据源的实例,我创建了一个绑定到 Provider<T> 的实例,该实例使用访问该数据源所需的信息进行了初始化。提供程序如下所示:

public class StandardListProvider<T> : Provider<IListExecutor<T>>
    where T : new()
{
    public string Name       { get; set; }
    public string ListMethod { get; set; }

    public StandardListProvider(string name, string listMethod)
    {
        Name       = name;
        ListMethod = listMethod;
    }

    protected override IListExecutor<T> CreateInstance(IContext context)
    {
        var connector = (IInternalConnector)context.Kernel.GetService(typeof(IInternalConnector));
        return new StandardListExecutor<T>(connector, Name)
        {
            ListMethodName = ListMethod
        };
    }
}

问题在于解决 StandardListExecutor<T> 的依赖关系,例如 IInternalConnector。显然我可以手动构造它们,或者像我在示例中那样从 context.Kernel 请求它们(并由 建议),但这会导致请求没有目标信息,如果我们想要为 StandardListExecutor.

的依赖项执行上下文绑定

我试过 context.Request.CreateChild(...),但这似乎需要对每次激活进行反思才能创建 ParameterTarget。 Ninject 文档中似乎也没有太多关于此的信息。

我的问题是:从现有绑定的激活过程中 resolve/request 依赖项或其他类似服务的正确方法是什么?

编辑

请求本身是通过 Ninject.Mvc 连接到 System.Web.Mvc 控制器激活过程中发出的。

您应该可以使用扩展程序 Ninject.Extensions.ContextPreservation。具体扩展方法 IContext.ContextPreservingGet(...):

var connector = context.ContextPreservingGet<IInternalConnector>();

但是,我个人认为创建特定的设置类型是更好的选择 - 因为它是更简单的想法。