让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;
}
我觉得这是一个很好的方法,我以前在项目中见过它…然而,当我尝试上面的方法时,控制器上的对象并没有反映对服务所做的更改。
问题是您正在尝试更改模型参数指向的地址。
尽管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);
}
}
}