Asp.Net Core RC1 -> Изменения интерфейса RTM - Удалено из Сервисов

Я использую карту структуры с 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();
    }
}

1 ответ

Решение

Насколько я знаю, одна из главных причин, почему это было удалено, из-за путаницы вокруг того, где это работает, а где нет. Например, 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

Другие вопросы по тегам