【问题标题】:ASP.NET 5 Non-Controller DI injectionASP.NET 5 非控制器 DI 注入
【发布时间】:2016-04-09 16:09:01
【问题描述】:

我正在尝试使用新的 ASP.NET 5 依赖注入系统,但它似乎仅限于从 Controller 继承的类的构造函数。

还有其他方法可以注入东西吗?特性?任何事物?这是非常严格的限制,已经让我好几天了。

【问题讨论】:

  • 这根本不正确,任何具有构造函数的类都可以轻松地向 DI 注册并在任何需要它们的地方注入,只要构造函数所需的所有类型也在 DI 中注册。链中的每个依赖项都必须向 DI 注册。是什么让您认为它仅限于控制器?
  • 1) 否则我找不到任何示例。 2)我不明白类是如何被实例化的。是什么创造了它?
  • 如果你能给我一个例子来说明这在其他类上是如何工作的,我将非常感激你。我只是没有“得到”它。它把我逼疯了。
  • 我想不通的主要事情是如何创建另一个类。
  • 我认为如果您阅读question and answer here 以及 cmets 中的讨论,它会对您有所帮助

标签: asp.net-core


【解决方案1】:

刚刚测试过这个(RC1 Update1),它也适用于其他类。 我写了一个小例子,首先是类型声明:

public interface IBaseServiceType { }

public interface IComposedServiceType
{
    IBaseServiceType baseService { get; }
}

public class BaseServiceImplementation : IBaseServiceType { }

public class ComposedServiceImplementation : IComposedServiceType
{
    public IBaseServiceType baseService { private set; get; }

    public ComposedServiceImplementation(IBaseServiceType baseService)
    {
        this.baseService = baseService;
    }
}

配置:

        services.AddTransient(typeof(IBaseServiceType), typeof(BaseServiceImplementation));
        services.AddTransient(typeof(IComposedServiceType), typeof(ComposedServiceImplementation));

并创建这样的实例,其中context 是您的HttpContext

 var composedServiceInstance = context.ApplicationServices.GetService<IComposedServiceType>();

【讨论】:

  • 即使没有HttpContext也能得到吗?
  • @Ciel:当然,您只需要引用IServiceProvider 实例。
  • Hrnm.. 我正在考虑如何获得它。基本上,我有一个需要运行的类,但它不在 Controller 中,而且根本没有 HttpContext。
  • 您必须做出决定何时您的“类需要运行”。
  • @Ciel:基本上你有两个选项来传递数据:使用堆栈或静态成员。静态成员可以在没有实例的情况下访问。
【解决方案2】:

将您的课程注册为服务并像对待所有其他服务一样对待它

Net Core Dependency Injection for Non-Controller

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-23
    • 2012-04-23
    • 1970-01-01
    • 1970-01-01
    • 2016-08-22
    • 1970-01-01
    • 2015-10-20
    相关资源
    最近更新 更多