让API控制器与服务对话的c#动作委托

本文关键字:对话 API 控制器 服务 | 更新日期: 2023-09-27 18:16:01

我以前见过这种方法,其中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;
}

我觉得这是一个很好的方法,我以前在项目中见过它…然而,当我尝试上面的方法时,控制器上的对象并没有反映对服务所做的更改。

让API控制器与服务对话的c#动作委托

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

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