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>();
但是,我个人认为创建特定的设置类型是更好的选择 - 因为它是更简单的想法。
在我的应用程序中,我可以按名称注册不同的数据源。这些数据源每个都需要一些 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>();
但是,我个人认为创建特定的设置类型是更好的选择 - 因为它是更简单的想法。