tutorial pages net asp application c# dependency-injection asp.net-core structuremap4

c# - pages - Asp.Net Core RC1-> Cambios RTM DI-Eliminado de los Servicios



javascript asp net (1)

Hasta donde yo sé, una de las razones principales por las que se eliminó esto es la confusión en torno a dónde funciona y dónde no. Por ejemplo, FromServices era el concepto de enlace modelo de MVC y algunos usuarios intentaron usarlo fuera de MVC y descubrieron que no funcionaba.

Sin embargo, puede crear su propio atributo de enlace de modelo para lograr un comportamiento similar.

Por ejemplo, esto funciona con la decoración en un modelo. NOTA: No he probado el ingenio en la propiedad de un controlador.

[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; } }

ACTUALIZAR :

Encontré el anuncio sobre su eliminación aquí: https://github.com/aspnet/Announcements/issues/115

Estoy usando el mapa de estructura con AspNet Core 1.0 RTM. Parece que lo han eliminado utilizando el atributo FromServices en las propiedades. Esto rompe el código a continuación porque ahora no puedo inyectar el ClaimsPrincipal. No estoy seguro de cómo conseguir que el sistema DI recoja esta propiedad. ¿Necesito crear un InputFormatter personalizado o algo más? Parece mucho trabajo para que esto vuelva a funcionar.

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(); } }