我正在尝试一次性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处理,因此它是我们乍看之下看不到的“自动化”的一部分。
所以我的问题是:
我想我错过了某种方式让DI充当对象工厂来提供我的对象,而不是试图以声明方式创建它们。
答案 0 :(得分:1)
如果您想通过依赖注入来解决约束,则首先需要注册它:
services.AddTransient<Constraint>();
获得IApplicationBuilder后,您可以直接访问服务:
app.ApplicationServices.GetRequiredService<Constraint>();
当然,如果您不想将Constraint
类型添加到服务列表中,仍然可以以相同的方式访问IDataService
。
这假设您在初创公司的顶部声明了using Microsoft.Framework.DependencyInjection;
;鉴于你的其他语法,我相信你这样做。