Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 我应该在哪里使用Ninject 2+;(我如何安排我的模块?)_Asp.net Mvc_Inversion Of Control_Ninject - Fatal编程技术网

Asp.net mvc 我应该在哪里使用Ninject 2+;(我如何安排我的模块?)

Asp.net mvc 我应该在哪里使用Ninject 2+;(我如何安排我的模块?),asp.net-mvc,inversion-of-control,ninject,Asp.net Mvc,Inversion Of Control,Ninject,我有两个相关的(关于这个问题)项目和其他几个项目的解决方案 类库,具有其他几个项目使用的功能 ASP.NETMVC应用程序 我的问题是,考虑到 类库需要一些DILove,其中包括需要web请求特定会话对象(想想工作单元)的存储库类 MVC应用程序需要DI,因为Ninject 2基本上是从NinjectHttpApplication继承的 类库的单元测试需要注意这一点,以便注入一组不同的存储库 出于同样的原因,需要注入web应用程序的单元测试 我在这里把自己画进了一个精神的角落,因为我只看到了

我有两个相关的(关于这个问题)项目和其他几个项目的解决方案

  • 类库,具有其他几个项目使用的功能
  • ASP.NETMVC应用程序
  • 我的问题是,考虑到

    • 类库需要一些DILove,其中包括需要web请求特定会话对象(想想工作单元)的存储库类
    • MVC应用程序需要DI,因为Ninject 2基本上是从NinjectHttpApplication继承的
    • 类库的单元测试需要注意这一点,以便注入一组不同的存储库
    • 出于同样的原因,需要注入web应用程序的单元测试
    我在这里把自己画进了一个精神的角落,因为我只看到了三个选项。类库中的DI,web应用中的DI,或两者都有,但每个都有问题:

    • 我不能只在类库中进行DI,因为MVC应用程序首先需要从NinjectHttpApplication继承
    • 我不能只在MVC应用程序中进行DI——毕竟类库被其他库使用,MVC应用程序不应该对库的内部内容了解太多
    • 我想这是我能看到的唯一出路:两个项目都由独立的国际奥委会负责。类库和MVC应用程序都有自己的IoC设置,并在不真正关心对方的情况下为自己的东西进行DI
    有没有人对如何做这样的事情有一些“最佳实践”或指导方针?我无法想象我是第一个出现这种情况的人,知道“正确”的方法是什么肯定很好


    谢谢

    我不知道NInject,但除非它的工作原理与Windsor、StructureMap等有很大不同,否则答案往往是一样的,因为有一些常见的DI模式。考虑到这一点:

    首先要认识到的是,DI与NInject或Windsor等特定框架无关。这是一套需要遵循的技术和设计模式。您可以使用所谓的穷人的DI手动进行DI,但显然使用DI容器会更好

    为什么这是相关的?这是相关的,因为一旦您意识到这一点,必然的结果是您的应用程序的绝大多数代码都不应该知道DI容器whatsover

    那么您在哪里使用DI容器呢?它应该只在组合根中使用,在您的情况下,它将对应于Global.asax。你可以在中读到更多关于这一点的内容——尽管这个问题是关于温莎的,但原则是一样的

    那么你的单元测试呢?他们也应该完全不知道DI容器。有关更多详细信息,请参阅


    通过大量使用构造函数注入,可以在库中实现DI。这样做不需要引用任何DI容器,但是如果您使用DI容器来解析来自组合根的所有依赖项,那么生活会变得更加轻松。

    Hi Mark-感谢您的回答,我想我现在已经知道了,至少大部分都知道了。但是,如果MVC/Global.asax负责设置所有DI,那么它是否也需要插入类库的内容?考虑类库可能需要存储每一个Web请求IsAsEngor或类似的东西,这将用于构建所有的存储库类。MVC应用程序是否应该知道这一点?只是试着让我的头围绕着“正确的事情”去做因为您使用的是MVC,所以最好的选择是使用自定义ControllerFactory创建具有所有依赖项的控制器。您可以在MvcContrib源代码中看到Windsor的一个例子:如果某些依赖项是库中的类型,那么这些依赖项应该由控制器导入。如果您需要将ISession实例传递到您的库,您可以使用控制器的ctx来完成此操作-它将由您的自定义工厂进行设置。再次感谢Mark。我得试试看——我想,没有什么比实际做事更好的了。Ninject是基于模块的,因此我可以在类库中创建一个单独的模块,该模块也可以由MVC应用程序中的IoC设置自动使用,我只需尝试一下。谢谢你!我目前正在使用一个国产版本的依赖项解析程序,并希望切换到一个流行的框架。我当前的方法将业务程序集中的所有具体类都标记为internal。为了将DI容器保存在Global.asax中,我必须公开我的具体类,这样它们才能得到解决,对吗?在直接隐藏(或至少防止实例化)我的具体类的同时,是否有其他方法将DI容器保留在组合根中?另外,我试着在你的博客上发布这个,但出现了一个错误。是的,你需要公开这些课程。这在任何情况下都是合适的,因为DI的基本目的是松耦合,因此是可维护性。这意味着您希望设计良好的类保持可维护性,如果您有,就没有理由将它们隐藏起来。在任何情况下,接口也起到了隔离的作用:相关:如果你真的想获得一个完整的洞察,那么重复一些值得挖掘的注释以获得完整性