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

时间:2016-11-30 03:33:40

标签: c# ninject

在我的应用程序中,我可以按名称注册不同的数据源。这些数据源每个都需要一些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中请求它们(并由Ninject Providers -> Get another dependency inside the provider建议),但是这会导致请求没有目标信息,如果我们这样做不理想想要为context.Request.CreateChild(...)的依赖关系执行上下文绑定。

我已尝试使用ParameterTarget,但这似乎需要反映每次激活以创建{{1}}。在Ninject文档中似乎没有关于此的更多信息。

我的问题是:在现有绑定的激活过程中,解决/请求依赖关系或其他类似服务的正确方法是什么?

修改

请求本身是通过Ninject.Mvc连接进入System.Web.Mvc控制器激活过程。

1 个答案:

答案 0 :(得分:0)

您应该可以使用扩展程序Ninject.Extensions.ContextPreservation。特别是扩展方法IContext.ContextPreservingGet(...)

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

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