问题标签 [ninject-conventions]

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 回答
405 浏览

asp.net-mvc-3 - 使用 ninject 和基于约定的绑定处理应用程序设置

我在 MVC3 应用程序中使用 Ninject 并尝试切换到使用 ninject.extensions.conventions 的基于约定的绑定。

现在假设我有一个需要访问应用程序设置的类,例如:

我想我了解如何像这样使用 Ninject 进行正常绑定:

但是我该如何使用约定来做到这一点呢?


如有需要,可提供额外信息:

我正在使用 nuget Ninject.MVC3 包,在 App_Start/NinjectWebCommon.cs 的 RegisterServices 中,这就是我目前拥有的所有内容:

0 投票
1 回答
992 浏览

c# - 基于约定的构造函数字符串参数与 Ninject 的绑定

我在我的项目中使用 Ninject 作为 IoC 容器。我有以下课程:

在我的应用程序设置文件中,我有一个名为“someDatabase”的连接字符串。默认情况下,应该添加以下配置,以便将此连接字符串注入构造函数:

但我想实现这些字符串的基于常规的绑定。名称以“ConnectionString”结尾的字符串类型的所有构造函数参数的值应取自应用程序的 connectionStrings 配置部分并自动注入。我也想为 appSettings 部分实现类似的约定。这种方法在 Mark Seeman 的“Primitive Dependencies”文章(“原语约定”部分)中有更详细的描述。示例中使用了 Castle Windsor 容器。

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

0 投票
2 回答
607 浏览

ninject - Ninject MetaData 约束 Get() 是否适用于子分辨率?

ninject.extensions.conventions用来绑定给定程序集中的所有实现,并用程序集名称标记它们作为绑定的元数据。我可以使用 Get 将这些项目拉回并提供 func 作为标准。

我想知道的是这个函数是否也适用于所有已解决的孩子?我担心的是,虽然我的逻辑现在有效,但如果我添加更多满足任何孩子不止一次的绑定,ninject 会抛出。

代码示例:

根据上面的示例,我知道 IRootDependency 将根据元数据过滤器解析为正确的绑定。

我正在寻找的是以下事实。

此过滤器不会向下馈送依赖链。IChildDependency 将抛出异常,因为虽然绑定指定了 MetaData,但它没有被查询。

0 投票
1 回答
1214 浏览

ninject - Ninject 约定和拦截

我想用拦截属性装饰我的服务,然后让基于约定的绑定为我设置拦截器。我不希望我的属性从拦截属性继承......如果我可以避免的话。

例如,我有以下课程:

我知道我可以按如下方式绑定它:

如何使用属性和拦截器的不同组合来做到这一点?例如:

如果我有 Log 和 Authorize 属性,我必须配置 3 组绑定?(1 为无授权日志,1 为无日志授权,1 为日志和授权)。

更新:虽然我无法根据我原来的问题参数找到解决方案,但我确实偶然发现了一个类似的问题,这导致我最终得到了解决方案。这是源代码:

注意: Common.Interception.Interceptors命名空间位于一个程序集中,该程序集引用了 Ninject.Extensions.Interception(及其所有必需的依赖项)。我的属性是在一个单独的程序集中定义的,没有它们自己的依赖项。

MiscExtensions.cs

AlternateInterceptorRegistrationStrategy.cs

IInterceptorConfig.cs

拦截器配置文件

TraceInterceptor.cs - 只是一个示例拦截器

注意:这是一个简单的控制台应用程序,展示了如何连接属性/拦截器。这依赖于 Ninject.Extensions.Interception.DynamicProxy 和 Ninject.Extensions.Conventions (以及它们所有必需的依赖项)

0 投票
2 回答
3082 浏览

ninject - 如何使用 Ninject 约定扩展将泛型类型与继承绑定

如何使用Ninject 约定InitializerForXXX将(非泛型实现)绑定到IInitializer<XXX>(泛型接口),以便请求解析名称以InitializerFor开头并以类似结尾的非泛型实现:IInitializer<T>typeof(T).Name

其中没有非抽象类直接实现IInitializer<T>,并且一些实现继承自其他实现:

  • InitializerForShadeOfBlue继承自InitializerForBlue
  • InitializerForBlue从抽象继承Initializer<Blue>
  • abstractInitializer<T>直接实现IInitializer<T>

我希望我可以将 a.EndsWith(typeof(T).Name)用于我可以使用的给定约定,因为在ShadeOfxxx静脉IInitializer<T>中实际上有数百个初始化程序。如果我必须映射所有这些,我最好找到一种在运行时通过反射解决的方法。

鉴于以下情况:

更新:使用自定义绑定生成器进行绑定(请参阅下面的答案以了解实现)

主要方法

初始化工厂

初始化器

内容模型

0 投票
1 回答
1250 浏览

ninject-extensions - 使用 Ninject 自定义实例提供者绑定成功,使用工厂方法参数解析

我一直在研究一个类似问题的公认答案,我认为具体工厂返回一个实现,该实现基于工厂方法上的字符串参数匹配具体实现上的命名绑定。

当工厂是抽象工厂并且我希望使用基于 Ninject 约定的绑定时,我正在努力让一个稍微复杂的示例正常工作。考虑以下测试:

这是我尝试使用火把和刀具玩杂耍的地方,因为我曾经在互联网上看到过:

当我尝试分配bicycleBuilderFactory此错误时,我被刺伤并着火:

是否可以使用方法和自定义提供程序进行绑定,使用工厂方法参数( )以及泛型类型参数( )来解析类型? ToFactory() "Germany"IVehicleBiulder<BlueBicycle>, BlueBicycle

这是测试的其余代码,尽可能紧凑和可读。

VehicleBuilder 实现

车辆实施:

0 投票
1 回答
2187 浏览

inversion-of-control - Ninject 约定与 Ninject 工厂扩展将多种类型绑定到一个接口

我正在尝试扩展题为Ninject Factory Extension Bind Multiple Concrete Types To One Interface by using Ninject Conventions for 基于约定的ICar实现绑定的 SO 问题中提出的场景。

我正在研究由 Akim和他的 Gist撰写的公认答案,概述了完整的示例。

不同之处在于我已经用ICar基于约定的绑定替换了显式绑定(或者至少尝试了它;)

当我尝试car在测试中实例化变量时,我得到ActivationException

我怎样才能让这个测试通过?

这是其余的代码,尽可能精简,这样您就不必参考原始问题

0 投票
0 回答
163 浏览

entity-framework - 修复 EF4.1 上下文 + Ninject 组合的内存泄漏

我有一个 Windows 服务,它使用 NCron 定期运行一些作业。我最近介绍了 Ninject 并遇到了一些严重的内存问题,因为 EF 上下文(来自 EF4.1 的 ObjectContext)没有经过 GC(我对其进行了内存分析)。

值得一提的是,其中一些作业运行时间很长(10-15 分钟)并且是数据库密集型的。我知道 EF 可能不是此类工作的最佳解决方案,但目前无法重构。

我找到了很多关于这个主题的材料,所以我继续:

  1. 在我的工作课程中实施 INotifyWhenDisposed
  2. 尝试在命名范围内定义 EF 上下文绑定,希望在作业完成后能够正确处理和 GC

我似乎无法让第二个工作,我得到一个命名范围不存在的 ActivationException。

这是我在调试模式下尝试的一段简单代码,它复制了这一点:

接着

为了简洁起见,我把剩下的剪掉了。

我究竟做错了什么?

更新 1 - 构造函数注入有效,当我明确.Get<T>表示异常发生时。

0 投票
1 回答
523 浏览

c# - 使用 Ninject Extensions 继承避免多重绑定

我有创建这样的层次结构的类:

基本上,这个想法是功能可以堆叠(每个派生级别将附加更多功能)。

我正在尝试使用 Ninject Conventions Extensions 以一种很好的方式绑定它。我所拥有的是:

当我请求DerivedHandler. Ninject 一点也不抱怨。但是,当我请求 a 时BaseHandler,我会看到:

有多个匹配的绑定可用。

显然,约定扩展正在考虑继承。当我请求BaseHandler.. 它应该给我 aBaseHandler还是 a DerivedHandler?(我想要BaseHandler..)。

有没有办法避免这种情况?我尝试了各种流利语法的组合,我可以得到“多个绑定”错误..或“未找到绑定”错误。

请注意,如果我手动绑定每个,这将非常有效。我认为这证明 Ninject 处理这个没有问题。它只是约定。

0 投票
1 回答
176 浏览

asp.net - 如何按约定正确绑定类型?

这些项目计划针对多平台,所以我在类库中提取了最大的代码,以便它可以轻松重用。

该架构基于模型-视图-演示者原则。

项目结构如下:

MVP

该项目包含项目的演示者和视图。例如:

视窗

该项目包含应用程序的 WPF GUI,以及所谓的 Composition Root。例如:

网络

该项目包含应用程序的 ASP.NET GUI 页面,以及所谓的 Composition Root。

嗯,我想你明白了……

我对依赖注入很陌生,甚至在约定绑定方面也很新。

我想知道如何使用 Ninject 使用约定配置绑定。

知道如何将这些视图与 Windows (WPF) 和 Pages (Web) 绑定吗?

编辑

在尝试了@BatteryBackupUnit 的建议后,我想我的问题全在于我对程序集的搜索。

如前所述,View接口与类不在同一个程序集中Window。上面的代码基于@BatteryBackupUnit 的回答,效果很好。