如何在 vNext 依赖注入中创建构造函数订阅

2024-01-03

我正在尝试使用一次性 vNext 应用程序。我想做的是创建一个名为“DataService”的虚拟类,它将返回一些数据,然后创建使用 DI 将 IDataService 参数作为构造函数的对象。

所以我的 IDataService/DataService 定义是:

public interface IDataService
{
    DateTime Created { get; }

}

public class DataService : IDataService
{
    private DateTime created = DateTime.Now;
    public DateTime Created
    {
        get { return created; }
    }

}

在我的启动类中,我将其注册为单例:

public void Configure(IApplicationBuilder app)
    {
        app.UseServices(services =>
        {
            services.AddSingleton<Data.IDataService, Data.DataService>();
        });

在我创建的类中,我添加 IDataService 接口作为构造函数依赖项:

internal class Constraint : IRouteConstraint
{
    private readonly IDataService _dataService;
    public Constraint (IDataService dataService)
    {
        _dataService = dataService;
    }
    public bool Match(....)
    {
       //call dataservice for match
    }
}

这里带有构造函数依赖的类是一个 IRouteConstraint,我试图用它来获取 MVC 中的动态路由 - 启动类代码的最后一部分是这样的:

 app.UseMvc(routes => {
            routes.MapRoute(name: "TestRoute", template: "{*constraints}", defaults: new { controller = "Test", action = "Index" }, constraints: new { constraint = new Constraint() }); //<--- how to construct using DI?

        });

问题是无法创建 Constraint() 类,因为它缺少构造函数。所有示例都显示使用 DI 的控制器,并且控制器类的实例化由 MVC 处理,因此这是我们乍一看看不到的“自动魔法”的一部分。

所以我的问题是:

  1. 如何实例化“约束”对象以便 DI 提供 DataService 单例的实现?
  2. 我的问题是因为我在 UseMvc 方法的配置方法中尝试这样做,还是我的问题比这更根本?

我认为我缺少某种方法让 DI 充当对象工厂来提供我的对象,而不是尝试以声明方式创建它们。


如果您想通过依赖注入解决约束,您需要首先注册它:

services.AddTransient<Constraint>();

一旦有了 IApplicationBuilder,您就可以直接访问服务:

app.ApplicationServices.GetRequiredService<Constraint>();

当然,如果您不想添加您的Constraint键入服务列表,您仍然可以访问IDataService一样的方法。

这假设你有using Microsoft.Framework.DependencyInjection;在您的 Startup 顶部声明;鉴于您的其他语法,我相信您会这样做。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 vNext 依赖注入中创建构造函数订阅 的相关文章

随机推荐