Asp.Net Core RC1 - > RTM DI更改 - 已删除FromServices

Phi*_*hil 7 c# dependency-injection structuremap4 asp.net-core

我正在使用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>();
    }
}
Run Code Online (Sandbox Code Playgroud)

Model.cs

public class Model {
    //[FromServices] <-- worked in RC1
    public ClaimsPrincipal Principal { get; set; }

    public string Value => Principal.Identity.Name; 
}
Run Code Online (Sandbox Code Playgroud)

TestController.cs

public class TestController : Controller {

    public IActionResult Test(Model model){
        return Ok();
    }
}
Run Code Online (Sandbox Code Playgroud)

Kir*_*lla 5

据我所知,其中一个主要原因被删除是因为围绕它工作的地方和不在哪里的混乱.例如,FromServicesMVC的模型绑定概念和一些用户尝试在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; }
}
Run Code Online (Sandbox Code Playgroud)

更新:

在此发现了有关将其删除的声明:https://github.com/aspnet/Announcements/issues/115