在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;
}
我觉得这是一个很好的方法,我之前已经在项目中看到了它...但是当我尝试上述操作时,控制器上的对象并不反映对服务所做的更改。
答案 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);
}
}
}