2016-07-12 8 views
7

私はAspNet Core 1.0 RTMで構造マップを使用しています。プロパティのFromServices属性を使用して削除したようです。これで、ClaimsPrincipalをインジェクトでき​​なくなったため、以下のコードが破られます。 DIシステムでこのプロパティを取得する方法がわかりません。カスタムInputFormatterなどを作成する必要がありますか?これはもう一度これを働かせるための多くの仕事のように思えます。私の知る限り自演としてAspNet Core RC1 - > RTM DI変更 - 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

あなたは、モデル内の依存関係が必要な場合は、アーキテクチャの問題を抱えているし、あなたのデザインを再考する必要があります。モデルは依存関係を持つべきではなく、プロパティインジェクションは依存関係を隠す可能性があり、テストとエラートラッキングは悪夢になります。プロパティインジェクションは、作成したオブジェクトのコントロールがないまれなコーナーケース(コンストラクタインジェクションを使用する方法がないところで作成されたWCFサービスプロキシ)でのみ使用されます。 – Tseng

答えて

5

これが取り除かれた主な理由の1つは、動作する場所とそうでない場所の混乱のためです。たとえば、FromServicesはMVCのモデルバインドの概念で、一部のユーザーは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; } 
} 

UPDATE

はこちらにその除去についての発表が見つかりました:https://github.com/aspnet/Announcements/issues/115

関連する問題