问题标签 [ninject-2]
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.
c# - ASP.NET MVC 3:具有继承/多态性的 DefaultModelBinder
首先,很抱歉这篇大文章(我已经尝试过先做一些研究)以及针对同一问题的技术组合(ASP.NET MVC 3、Ninject 和 MvcContrib)。
我正在使用 ASP.NET MVC 3 开发一个项目来处理一些客户订单。
简而言之:我有一些继承自抽象类的对象,Order
当向我的控制器发出 POST 请求时,我需要解析它们。如何解决正确的类型?我是否需要重写DefaultModelBinder
课程或有其他方法可以做到这一点?有人可以为我提供一些关于如何执行此操作的代码或其他链接吗?任何帮助都会很棒!如果帖子令人困惑,我可以做任何更改以使其清楚!
因此,对于需要处理的订单,我有以下继承树:
这些类都是由实体框架生成的,所以我不会修改它们,因为我需要更新模型(我知道我可以扩展它们)。此外,还会有更多订单,但都源自Order
.
我有一个通用视图 ( Create.aspx
) 来创建订单,并且该视图为每个继承的订单(在本例中OrderBottling
为 OrderFinishing
我Create()
为 GET 请求定义了一个方法,为OrderController
类上的 POST 请求定义了另一个方法。第二个是这样的:
现在的问题是:当我收到带有表单数据的 POST 请求时,MVC 的默认绑定器会尝试实例化一个Order
对象,这没关系,因为方法的类型就是这样。但是因为Order
是抽象的,所以不能实例化,这是应该做的。
问题:如何发现Order
视图发送的具体类型?
我已经在 Stack Overflow 上搜索过,并在 Google 上搜索了很多(我正在研究这个问题大约 3 天!)并找到了一些方法来解决一些类似的问题,但我找不到像我真正的问题。解决此问题的两种选择:
- 覆盖 ASP.NET MVC
DefaultModelBinder
并使用 Direct Injection 来发现哪个类型是Order
; - 为每个订单创建一个方法(不美观,维护起来会有问题)。
我没有尝试过第二种选择,因为我认为这不是解决问题的正确方法。对于第一个选项,我尝试了 Ninject 来解析订单的类型并实例化它。我的 Ninject 模块如下所示:
我试图通过 Ninject 的Get<>()
方法获得其中一种类型,但它告诉我解析类型的方法不止一种。所以,我知道该模块没有很好地实现。我也尝试为这两种类型实现这样的:Bind<Order>().To<OrderBottling>().WithPropertyInject("OrderTypeId", 2);
,但它有同样的问题......实现这个模块的正确方法是什么?
我也尝试过使用 MvcContrib Model Binder。我已经这样做了:
Global.asax.cs
我已经这样做了:
但这会引发异常:System.MissingMethodException: Cannot create an abstract class。所以,我认为活页夹不是或无法解析为正确的类型。
非常感谢提前!
编辑:首先,感谢 Martin 和 Jason 的回答,并对延误表示歉意!我尝试了这两种方法,都奏效了!我将 Martin 的答案标记为正确,因为它更灵活并且可以满足我项目的一些需求。具体来说,每个请求的 ID 都存储在数据库中,如果我只在一个地方(数据库或班级)更改 ID,将它们放在班级上可能会破坏软件。在这一点上,马丁的方法非常灵活。
@Martin:在我的代码中,我更改了行
至
因为我的课程在另一个项目上(因此,在不同的程序集上)。我之所以分享这个,是因为它似乎比只获取无法解析外部程序集类型的执行程序集更灵活。在我的情况下,所有订单类都在同一个程序集中。这不是更好也不是一个神奇的公式,但我认为分享这个很有趣;)
asp.net-mvc - 使用 Ninject 和 DependencyResolver 在 ASP.NET MVC 3 中创建引导程序
我正在尝试创建一个简单的引导程序。我的助推器代码如下所示:
IBootstrapperTask 界面如下所示:
我的第一次尝试是通过引导程序注册路由:
我的 global.asax 看起来像:
我的 NinjectDependencyResolver 看起来像:
但是,当我尝试运行此代码时,出现以下异常:
激活 VirtualPathProvider 时出错 没有匹配的绑定可用,并且类型不是自绑定的。
激活路径:
3)RouteCollection类型的构造函数的参数virtualPathProvider中注入依赖VirtualPathProvider
2) 将依赖RouteCollection注入到RegisterRoutes类型的构造函数的参数路由中
1) 请求 IBootstrapperTask
任何帮助将不胜感激。
编辑
我的示例工作所需的缺失绑定是:
如果您使用 Ninject MVC 扩展,则不需要此绑定,因为它已经具有此绑定以及其他一些开箱即用的绑定,如下面的答案所示。
ninject - Ninject 不在 WCF 中使用构造函数参数创建新实例
这是场景。我有一个 WCF 服务,当调用此服务时,它会将控制权传递给另一个类的实例(通过 Ninject 创建)。在那个类中,我需要做一些工作,特别是实体框架和存储库。长话短说,我声明了以下绑定。
当我想使用这个存储库时,我有以下内容。
问题是,如果它是一个全新的请求,我只会得到一个新的 genericProductRepository 实例,如果在同一个请求中多次调用该方法,我会收到一个错误,指出上下文(EF 上下文)已经被释放,这是因为似乎我正在获取已在 using 语句中处理的相同实例。用另一种方式解释它,使用 Microsoft WCF 测试客户端,如果我第一次调用它,代码运行良好,如果我再次按下调用按钮(不重新启动测试客户端,即相同的请求)然后它抛出这个错误关于它已经被处置了。
我试图玩弄 Ninject 附带的各种“范围”,但显然我错过了一些东西。
所以我的基本问题是,当它到达那条线时,我如何获得一个新的存储库,而不是使用同一个?非常感谢您的帮助,我真的在努力推动我的公司采用 Ninject 并放弃 Spring。
c# - 如何将 IoC 容器保存在一个地方,而内部类在构建后需要创建依赖项
我开始在这个相对较小的项目上使用 Ninject 并且遇到了一个问题:我有这个类
这取决于
这又取决于
有DataRepository
一个看起来像这样的演员:
现在,我需要能够BizEntityModel
跨多个实例使用单个IDataRepository
实例。
我还需要创造IDataRepository
一个IBizLogicModule
。IBizLogicModule
不知道 Ninject,我想保持这种状态。
所以我的问题是:如何使用 Ninject 内核连接所有这些,同时:
不必在层周围传递内核实例。
使代码的可读性接近于 Ninject 之前的代码(我只是使用工厂方法新建)。
到目前为止,我得到的接线的简单部分是:
非常感谢您的指导
编辑:感谢您的回答!
这是请求的更多数据:
BizEntityModel
已向 Ninject 注册(代码已更新)。
如果我理解正确:我可以使用“工厂方法”创建实例IDataRepository
。IBizLogicModule
但这给我留下了:
1)我需要将 a 传递BizEntityModel
给工厂方法,有时它是全新的,有时它是现有实例。使用工厂方法,每次都会创建一个新的。
2)这SomeService
是另一个程序集中的问题吗,只有它有一个对 Ninject.dll 的引用?
c#-4.0 - 如何为 NinjectModule 中调用的方法提供注入
我有以下NinjectModule
派生类:
我的问题是IKernel
没有暴露.Get<T>
扩展方法。
有这样做的模式吗?
警告:我不想用 Ninject 属性来装饰我的类,因为它Add
是特定于MainClass
我希望所有代码与其创建相关的工作方式都保存在这个模块中的。
TIA
ninject - Ninject 如何在不创建实例的情况下检查给定类型的绑定
所以我只是想测试我的模块,通常我会用给定的模块创建一个内核,然后尝试获取一个实例,但是这种情况涉及一些模块,如果我可以检查某些模块会更好访问某些绑定(即实现和接口)
有没有办法检查给定类型的绑定是否可用而不创建类的实例(即,我不必确保这些依赖项存在)?
c# - 注入属性不适用于字段
注入属性不适用于字段。
我正在使用默认的 Ninject 设置。为什么不注入字段?
asp.net-mvc - 使用 Ninject 将存储库注入自定义成员提供程序
我正在尝试使用 MVC 3 中的 ninject 将存储库注入自定义成员资格提供程序。
在 MembershipProvider 我尝试了以下方法:
和
在我的 ninject 模块中,我尝试了以下操作:
以上都不起作用。
当我使用(在 global.asa 中)
和...一起
它可以工作,但是我没有生命周期管理,这将导致 NHibernate 出现“ISession 已打开”错误,因为 ISession 是 InRequestScope 而存储库不是。
c# - 无法弄清楚如何让这些 DI 东西运行起来
好吧,我觉得自己像个白痴。我已经阅读了文档,但仍然无法与 Ninject 一起使用。
如您所见,我需要为上面的类注入构造函数。好吧,事情进展得不太顺利。帮助!!在我回到编写 perl 代码之前。开玩笑!!哈哈
想的人?
asp.net-mvc-3 - 我应该尽量减少控制器中的接口数量吗?
在下面的片段中,我有我的控制器,它需要三个接口。这些是通过 Ninject 连接起来的。好的,一切都很好,绝对是朝着正确方向迈出的一步。我的问题是这个?
1.) 以这种方式将 3 个接口包装成一个接口和一个实现会更好,从而减少传递给控制器 ctor 的参数数量吗?2.) 别管它,它有效吗?
我一直在寻找将地狱从一切事物中抽象出来的方法。想法?
}