【问题标题】:How can I pass an already instantiated IOC container to an Asp.net 5 application?如何将已经实例化的 IOC 容器传递给 Asp.net 5 应用程序?
【发布时间】:2015-12-30 20:22:29
【问题描述】:

使用 .Net 核心,我创建了一个控制台应用程序,它自己托管一个 asp.net 5 以支持端点(接收通知、健康检查等)。

在阅读 dependency injection in Asp.net 5 时,它展示了如何使用自定义 IoC 容器,但它从 Asp.net 5 ConfigureServices() 方法中实例化容器。

这在同时托管 asp.net 5 应用程序的控制台应用程序中造成的问题是,WebHostBuilder 似乎实例化了Startup 类的新实例,而您可以更改哪个类是“带有.UseStartup<MySTartup>() 的startup" 类,您仍然无法控制Asp.net 使用MyStartup 的哪个实例,这意味着无法将已设置的容器传递给它。

有没有办法(不使用全局变量)设置 IoC 容器并将其传递给 Asp.Net 5?

【问题讨论】:

    标签: c# asp.net asp.net-core


    【解决方案1】:

    啊,但你可以。如果我正确理解您的问题,这应该提供您需要的行为:

    当 ASP.NET 5 应用程序启动时,Startup 类用于 引导应用程序,加载其配置设置等。 (了解有关 ASP.NET 启动的更多信息)。但是,如果存在一个名为 Startup{EnvironmentName}(例如 StartupDevelopment)和 ASPNET_ENV 环境变量匹配那个名字,然后那个 Startup 而是使用类。

    http://docs.asp.net/en/latest/fundamentals/environments.html#startup-conventions

    至于传递容器,最好避免这种情况。作为最后的手段,你可以依赖我在使用 DI 友好框架之前使用的技术:在启动时引导容器实例时,使用反射在加载的程序集中查找 IoC 配置,并调用它们的方法,传入容器。

    【讨论】:

    • 这表示我可以告诉它使用哪个类作为 Startup 类,但不能告诉它使用哪个 Instance。我需要获取类的实例,以便可以将 IOC 容器传递给它。我也不确定为什么 Asp.Net 基础设施和我的应用程序的控制台部分使用相同的 IOC 容器是一个坏主意。此外,我几乎总是使用反射来设置 IOC,但当前设置的问题是我必须有两种机制来编码这些 IoC 约定,并使它们保持同步
    • @KallDrexx 明白了。好的,因此,如果您将IServiceProvider 参数添加到包含控制台应用程序主入口点的类的构造函数,那么框架应该注入您从ConfigureServices 返回的提供程序。然后,您可以将其传递给您用于启动 ASP.NET 应用程序的 WebHostBuilder 的构造函数。
    • 不,这似乎已从 RC1 中删除。从 RC1 开始,您必须始终再次拥有静态入口点 :( github.com/aspnet/Announcements/issues/113
    【解决方案2】:

    浏览 Github,看来这是不可能的。 Asp.net 5 必须始终是 ioc 容器的创建者,与应用程序的其余部分共享 IOC 容器的唯一方法是从IWebApplication.ApplicationServices 属性中获取它以用于应用程序的其余部分。

    我提出了Github issue,希望能在某个时候解决这个问题。

    【讨论】:

      猜你喜欢
      • 2017-05-30
      • 1970-01-01
      • 1970-01-01
      • 2015-02-12
      • 1970-01-01
      • 2014-03-16
      • 1970-01-01
      • 1970-01-01
      • 2019-06-28
      相关资源
      最近更新 更多