gpt4 book ai didi

c# - 如何在 vNext 依赖注入(inject)中创建构造函数订阅

转载 作者:行者123 更新时间:2023-11-30 17:44:15 25 4
gpt4 key购买 nike

我正在试验一次性 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 接口(interface)添加为构造函数依赖项:

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. 如何实例化“约束”对象以便 DI 提供 DataService 单例的实现?
  2. 我的问题是因为我在 UseMvc 方法的 Configure 方法中尝试这样做,还是我的问题比那更根本?

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

最佳答案

如果你想通过依赖注入(inject)解决你的约束,你需要先注册它:

services.AddTransient<Constraint>();

拥有 IApplicationBuilder 后,您可以直接访问服务:

app.ApplicationServices.GetRequiredService<Constraint>();

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

这假设您在 Startup 的顶部声明了 using Microsoft.Framework.DependencyInjection;;考虑到您的其他语法,我相信您会这样做。

关于c# - 如何在 vNext 依赖注入(inject)中创建构造函数订阅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29897027/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com