Asp.Net 核心 RC1 -> RTM DI 更改 - 已从服务中删除

本文关键字:服务 删除 更改 RTM 核心 Net RC1 Asp DI | 更新日期: 2023-09-27 17:56:33

我正在使用AspNet Core 1.0 RTM的结构图。看来他们已经使用属性上的 FromServices 属性删除了它们。这会破坏下面的代码,因为我现在无法注入 ClaimsPrincipal。我不确定如何让 DI 系统拾取此属性。我是否需要创建自定义输入格式化程序或其他内容。这似乎需要做很多工作才能让它再次工作。

启动.cs

public class Startup {
    public IServiceProvider ConfigureServices(IServiceCollection services) {
        var container = new Container();
        container.Configure(i => {
            i.For<IHttpContextAccessor>()
                .Use(new HttpContextAccessor());
            i.For<ClaimsPrincipal>()
                .Use(x => x.GetInstance<IHttpContextAccessor>().HttpContext.User);
        });
        container.Populate(services);
        return container.GetInstance<IServiceProvider>();
    }
}

型号.cs

public class Model {
    //[FromServices] <-- worked in RC1
    public ClaimsPrincipal Principal { get; set; }
    public string Value => Principal.Identity.Name; 
}

测试控制器.cs

public class TestController : Controller {
    public IActionResult Test(Model model){
        return Ok();
    }
}

Asp.Net 核心 RC1 -> RTM DI 更改 - 已从服务中删除

据我所知,删除它的主要原因之一是因为它在哪里工作和在哪里不工作。例如,FromServices是MVC的模型绑定概念,一些用户尝试在MVC之外使用它,发现它不起作用。

但是,您可以创建自己的模型绑定属性来实现类似的行为。

例如,这适用于模型上的装饰。注意我还没有在控制器的属性上测试过机智。

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public class FromDIAttribute : Attribute, IBindingSourceMetadata
{
    public BindingSource BindingSource { get { return BindingSource.Services; } }
}
public class Customer
{
    [FromDI]
    public IFooService FooService { get; set; }
    public string Name { get; set; }
}

更新:

在这里找到有关其删除的公告:https://github.com/aspnet/Announcements/issues/115