c# type Asp.Net核心RC1-> RTM DI更改-刪除FromServices



startup cs (1)

我正在使用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