Asp.Net 核心 RC1 -> RTM DI 更改 - 从服务中删除
Asp.Net Core RC1 -> RTM DI changes - Removed FromServices
我在 AspNet Core 1.0 RTM 中使用结构图。看来他们已经使用属性上的 FromServices 属性删除了。这会破坏下面的代码,因为我现在无法注入 ClaimsPrincipal。我不确定如何让 DI 系统接收这个 属性。我是否需要创建自定义 InputFormatter 或其他东西。要使它再次运行似乎需要做很多工作。
Startup.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>();
}
}
Model.cs
public class Model {
//[FromServices] <-- worked in RC1
public ClaimsPrincipal Principal { get; set; }
public string Value => Principal.Identity.Name;
}
TestController.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
我在 AspNet Core 1.0 RTM 中使用结构图。看来他们已经使用属性上的 FromServices 属性删除了。这会破坏下面的代码,因为我现在无法注入 ClaimsPrincipal。我不确定如何让 DI 系统接收这个 属性。我是否需要创建自定义 InputFormatter 或其他东西。要使它再次运行似乎需要做很多工作。
Startup.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>();
}
}
Model.cs
public class Model {
//[FromServices] <-- worked in RC1
public ClaimsPrincipal Principal { get; set; }
public string Value => Principal.Identity.Name;
}
TestController.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