问题标签 [ninject-extensions]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
995 浏览

dependency-injection - 如何让 ninject 基于工厂参数-> 命名空间路径进行绑定?

我正在使用来自 NuGet 的 Ninject 3.0.1.10 和 ninject.extensions.factory 3.0.1.0 - 在“真实”场景中,我也将使用 ninject.extensions.conventions(而不是手动绑定 IFoo),但我想将其排除在外以尝试简化问题。

我有一个 IFoo 接口和它的多个实现,每个实现都在一个子命名空间和名为 Gen1 和 Gen2 的子文件夹下。我有一个 IFooFactory 接口,其目的是它根据指定的参数(字符串、枚举等)返回一个 IFoo。

我在这个例子中使用枚举只是为了让它更清楚 - 我最初制作了一个字符串版本,但感觉像传递一个更任意的参数(如字符串)的反对意见只会混淆这个问题。

现在,我知道让消费者“选择”这样的实现是一种理想情况下不存在的耦合形式,但恕我直言,它与 Ninject 已经支持的命名绑定具有相同级别的耦合。我想避免将属性添加到实现中,并且在工厂接口中使用 GetGen1 / GetGen2 / etc 方法非常适合这一点,因为我最终会通过某个开关将输入映射到要调用的方法来违反 OCP (或手动使用反射)

如果可能的话,我现在宁愿避免的完整/工作代码在这里:https ://gist.github.com/4549677

它使用两种方法:

  1. 手动工厂实现违反了 OCP 并通过了 enum 上的开关
  2. 使用带有 IInstanceProvider 实例的工厂扩展(子类 StandardInstanceProvider 以覆盖 GetInstance)。

第二种方法似乎“接近”让这个工作的“正确方法”,但是 1)它保持对内核的引用以完成它的工作,这可能是一个坏主意,并且 2)因为在调用期间搜索所有 IFoo 绑定时,我在 IFoo 绑定中找不到具体类型,它当前执行 GetAll,因此它实例化的实例比此场景所需的实例多 N-1 个。

0 投票
2 回答
360 浏览

c# - 让 Ninject 工作

显然,我错过了一些东西。我有一个 MVC 应用程序并安装了 Ninject 3 和 MVC3 扩展(尽管我正在运行 MVC4)。我有一个SiteSettings在整个项目中引用的类,如下所示:

我像这样构建了一个数据持久性对象:

...我的NinjectWebCommon.cs长相是这样的:

在我看来,我已经满足了依赖注入的所有要求。我的Global.asax.cs Application_Start()样子是这样的:

...然而,当我尝试收集我需要的数据时,我的SiteSettings班级总是有一个空值。IUnitOfWorkFactory

我究竟做错了什么?一切似乎都像所有例子所暗示的那样,但我没有得到爱。

更新

使用 Bassam Mehanni 的建议,我将我的DataPersister课程改写为如下所示:

...但当然现在我的SiteSettings班级抱怨我的无参数构造函数。我该怎么办?

更新 2

好的,继续,我DataPersister像这样重写了我的课程:

然后我SiteSettings像这样重写了我的课程:

这不应该工作吗?因为它没有。该类DataPersister始终使用无参数构造函数调用。我的内核绑定如下所示:

还有什么我想念的吗?这变得非常令人沮丧。

0 投票
1 回答
351 浏览

c# - Ninject Interceptor 调用两次 beforeinvoke 和 afterinvoke 方法

我正在 asp.net 中开发一个应用程序,在该应用程序中我正在实现 Ninject 拦截器,我在其中绑定/注册服务,例如

当我调用此服务的方法时

方法 BeforeInvoke 在 TimeInterceptor 中调用了两次。为什么?

0 投票
1 回答
1403 浏览

.net - Ninject 中的“范围”、“上下文”等有什么区别?

范围上下文命名绑定(和激活块?)的 Ninject 概念能否在概念级别上分开并清楚地解释?

例如,我有一个从数据库加载数据记录的服务,它通过 Ninject 工厂扩展为每条记录构造一个“工人”。服务和单个工作人员都使用实体框架的对象上下文与数据库进行交互。ObjectContext 通过构造函数注入到两者(以及其他共享依赖项)。目前它是单线程的,但最终工作人员需要在自己的线程中并行运行,因此他们将需要自己的 ObjectContext 实例和显式的启动/处置生命周期。ObjectContext 实例需要在工作人员的“工作单元”期间共享(因此不是暂时的,因为它被注入到工作人员使用的多个存储库中)。我被困在试图获得这个功能。

我天真地想要这样的东西(使用命名范围上下文保存扩展):

这显然(至少对 Ninject 用户来说是显而易见的)由于 MyDbContext 导致“多个匹配的绑定...”错误。在阅读了更多之后,我现在认为我可能应该为工作人员使用命名绑定,它是 ObjectContext。我认为我仍然需要范围,以便我可以在工作人员完成时显式处置 ObjectContext(并且具有来自 ninject 范围处理的处置方法)。

无论如何,我仍然主要是在猜测,我发布这个问题是希望有人可以在 Ninject 中澄清这些概念。

0 投票
1 回答
963 浏览

c# - Ninject NamedScope 条件绑定

我正在尝试对我是否在命名范围内进行条件绑定。

我的接口 ILogger - 使用 Ninject Logger 扩展的默认行为,我们将特定类型的记录器实现注入到每个类中。但是,在系统的一部分中,我们需要一个范围范围的记录器实例,它是在 NamedScope 的生命周期内生成和处置的......

目前(基本上)我们有这个:

但是,我真正想要的是:

因为这将允许更改事件范围定义对象并保持相同的行为。

我试过这个但无济于事:

0 投票
1 回答
1022 浏览

c# - Ninject 工厂扩展内存泄漏?

我使用以下接口作为ToFactory()绑定:

当我绑定时,ToFactory()我可以成功地创建类,但随后会出现内存泄漏,其中 register、unregister 和 valueGetter 参数由ConstructorArgument内部 Ninject 保存,它引用了委托中的目标/参数对象。这可以防止目标对象被 GC。如果这有所作为,我也在使用 ContextPreservation 扩展。(请参阅下面的完整示例代码)

当我删除“ToFactory()”绑定并创建一个标准工厂类时,它就可以工作了。

并且我的委托内的目标对象已成功进行 GC。

是不是我做错了什么,或者工厂扩展不是为了处理这些更复杂的参数?我假设如果我使用.WithConstructorArgument我会得到相同的结果。

编辑:添加了所有必要的绑定并重写了我的示例代码:

0 投票
1 回答
342 浏览

c# - 基于类注解或继承类型扫描程序集和自动绑定

我需要扫描所有程序集以查找具有特定属性的类(或从抽象类ColorTest继承的类)并将它们自动绑定到ColorTest。然后我需要实例化和枚举ColorTest的所有实现

组装 1:

组装 2:

组装 3:

装配 4:

示例是对更复杂问题的抽象和简化。

Ninject 可以帮我处理描述的场景吗?如果是怎么办?

0 投票
1 回答
255 浏览

ninject - Ninject.Extensions.Wcf.SelfHost 与 nuget?

我从 nuget 中提取了最新的Ninject.Extensions.Wcf (3.0.0.5),但是

SelfHost 示例中使用的 NinjectWcfConfiguration类型不在那个包中?

0 投票
1 回答
1702 浏览

c# - 使用 Ninject 和 Ninject.Extensions.Nlog2 的空引用异常

我有一个使用 Ninject、Ninject.Logging 和 Ninject.Extensions.NLog2 的简单控制台应用程序,它们都使用最新的 nuget 包构建。

我的应用程序执行以下操作

StandardKernel在调用时从内部得到一个空引用异常Get<ILogger>()

我还需要进行更多配置才能使日志记录正常工作吗?

0 投票
1 回答
440 浏览

ninject - Ninject 按约定使用 BindToFactory 绑定到具有类 T 的工厂接口

我想替换这段代码:

像这样:

我尝试创建一个 IBindingGenerator,但在尝试从 T 获取 ITaskFactory<T> 时陷入困境。