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();
}
}
据我所知,删除它的主要原因之一是因为它在哪里工作和在哪里不工作。例如,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