C#与API控制器的Action委托与服务进行通信

时间:2016-11-03 09:44:19

标签: c# asp.net-web-api delegates

在API控制器使用将单元工作对象放入Action委托的包装器之前,我已经看到过这种方法。然后,当使用委托时,它会与接受模型并返回Void的服务层方法进行对话。我们的想法是从外部范围传递模型。

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

我觉得这是一个很好的方法,我之前已经在项目中看到了它...但是当我尝试上述操作时,控制器上的对象并不反映对服务所做的更改。

1 个答案:

答案 0 :(得分:1)

问题是您正在尝试更改模型参数指向的地址。

尽管Member是一个引用类型,您可以在方法中修改它,但您无法修改它指向的地址。 (您可以修改参数的地址,但不能修改参数的地址)
如果需要,您必须使用ref关键字

检查以下示例

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