如何在vNext依赖注入

时间:2015-04-27 13:21:37

标签: c# asp.net-mvc dependency-injection asp.net-core asp.net-core-mvc

我正在尝试一次性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的Controller,并且Controller类的实例化由MVC处理,因此它是我们乍看之下看不到的“自动化”的一部分。

所以我的问题是:

  1. 如何实例化'Constraint'对象,以便DI提供DataService单例的实现?
  2. 是我的问题,因为我在UseMvc方法的Configure方法中尝试这个,或者我的问题比那更基本?
  3. 我想我错过了某种方式让DI充当对象工厂来提供我的对象,而不是试图以声明方式创建它们。

1 个答案:

答案 0 :(得分:1)

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

services.AddTransient<Constraint>();

获得IApplicationBuilder后,您可以直接访问服务:

app.ApplicationServices.GetRequiredService<Constraint>();

当然,如果您不想将Constraint类型添加到服务列表中,仍然可以以相同的方式访问IDataService

这假设您在初创公司的顶部声明了using Microsoft.Framework.DependencyInjection;;鉴于你的其他语法,我相信你这样做。