2016-11-03 9 views
1

このアプローチは、APIコントローラが、ハンドオフオブジェクトをアクションデリゲートに置くラッパーを使用する前に見てきました。次に、デリゲートが使用されると、モデルを受け取り、Voidを返すサービスレイヤメソッドと通信します。考え方は、モデルを外側のスコープから渡すことです。API contollersがサービスと対話するためのAPI代理人の代理代理

//Controller Base 
    public void Wrapper(Action<UnitOfWork> action) 
    { 
     action(new UnitOfWork()); 
    } 

    //Controller 
    [HttpPost] 
    [Route("user")] 
    [ResponseType(typeof(Member))] 
    public async Task<IHttpActionResult> PostUser(Member user) 
      { 

       Wrapper(uw => { service.Get(uw, user); }); 
       return Ok(user); 
      } 

    //Service 
    public void Get(UnitOfWork uw, Member model) 
      { 
       model = uw.MemberRepository.Get(u => u.UserId == id).FirstOrDefault(); 

      //Member m = uw.MemberRepository.Get(u => u.UserId == id).FirstOrDefault(); 
      //model.Created = m.Created; 
      //model.ExpiryInDays = m.ExpiryInDays; 
      //model.Id = m.Id; 
      } 

私は上記をしようとするが、コントローラ上のオブジェクトがサービスで行った変更を反映していない...私はこれはいいアプローチであると感じ、私は前のプロジェクトでそれを見てきました。

+0

をチェック構造体ではありません –

+0

ありがとう、私はそれがクラスとして宣言されていることを確認することができます。クラスと宣言された他のオブジェクトを試しましたが、何もしません –

+0

わかっているように私の問題を反映するようにコードを更新しました。私はEFリポジトリからデータを取得してモデルを変更しようとしています。コメントアウトされたコードが機能します。 EFコードはコントローラー側の変更を反映していません –

答えて

1

問題は、モデルパラメータが指すアドレスを変更しようとしていることです。

メンバーは参照型であり、メソッド内で変更することはできますが、指すアドレスを変更することはできません。 (あなたが引数のアドレスパラメータのアドレスを変更することはできませんが)
あなたはREFキーワードに

を使用する必要があることが必要な場合ApplicationUserがclass` `として宣言されていることを確認し、次の例

namespace Test 
{ 
    using System; 
    public class MyObject 
    { 
     public string Value { get; set; } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      MyObject obj = new MyObject() { Value = "original" }; 

      Console.WriteLine(obj.Value); 
      Change2(obj); 
      Console.WriteLine(obj.Value); 
      Change3(ref obj); 
      Console.WriteLine(obj.Value); 

      Console.ReadKey(); 
     } 

     private static void Change2(MyObject obj) 
     { 
      obj = new MyObject() { Value="You can't see this outside the method" }; 

      Console.WriteLine("Inside Change 2 "+obj.Value); 
     } 

     private static void Change3(ref MyObject obj) 
     { 
      obj = new MyObject() { Value = "You CAN see this outside the method" }; 

      Console.WriteLine("Inside Change 3 " + obj.Value); 
     } 
    } 
} 
+0

それがあります!私はrefキーワードがValue型のためだけど。いいねだからそれをまとめてください。コメントアウトされたコードでは、私はオブジェクトの値を変更するだけでしたが、そのメモリアドレスは常に同じように肯定的な結果でした。しかし、リポジトリからデータを取得しようとすると、返されたオブジェクトのメモリアドレスが効果的に適用され、他の場所には反映されません。これにあなたのサポートをありがとう! –

+1

@MarkHollasあなたは正しいです。問題はモデル=でした... –