2016-07-12 4 views
7

Ich verwende Strukturkarte mit dem AspNet Core 1.0 RTM. Offenbar wurden sie mithilfe des FromServices-Attributs für Eigenschaften entfernt. Dies bricht den folgenden Code, da ich jetzt das ClaimsPrincipal nicht injizieren kann. Ich bin mir nicht sicher, wie ich das DI-System dazu bringen soll, diese Eigenschaft aufzunehmen. Muss ich einen benutzerdefinierten InputFormatter oder etwas anderes erstellen. Das scheint eine Menge Arbeit zu sein, um das wieder zum Laufen zu bringen.Asp.Net Core RC1 -> RTM DI Änderungen - Removed FromServices

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

Wenn Sie Abhängigkeiten in Ihrem Modell benötigen, können Sie architektonische Probleme haben und müssen Ihr Design zu überdenken. Modelle sollten keine Abhängigkeiten aufweisen, und die Eigenschafteninjektion wird wahrscheinlich Abhängigkeiten verbergen, was das Testen und die Fehlerverfolgung zu einem Albtraum macht. Die Eigenschafteninjektion wird nur für seltene Fälle verwendet, in denen Sie keine Kontrolle über das erstellte Objekt haben (z. B. WCF-Dienstproxys, die erstellt werden, wenn Sie keine Möglichkeit haben, die Konstruktorinjektion zu verwenden). – Tseng

Antwort

5

Soweit ich kno w, einer der Hauptgründe, warum dies entfernt wurde, ist wegen der Verwirrung um, wo es funktioniert und wo nicht. Zum Beispiel war FromServices das Modellverbindungskonzept von MVC und einige Benutzer haben versucht, es außerhalb von MVC zu verwenden und fanden es nicht funktionierend.

Sie können jedoch ein eigenes Modell-Bindungsattribut erstellen, um ein ähnliches Verhalten zu erzielen.

Zum Beispiel funktioniert dies mit Dekoration auf einem Modell .. HINWEIS Ich habe nicht wit auf einer Controller-Eigenschaft getestet.

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

UPDATE:

Fand die Ankündigung über seine Entfernung hier: https://github.com/aspnet/Announcements/issues/115

Verwandte Themen