【问题标题】:C# Action delegate for API controllers to talk to Services用于 API 控制器与服务对话的 C# 操作委托
【发布时间】:2019-03-06 00:32:56
【问题描述】:

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

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

【问题讨论】:

  • 确保 ApplicationUser 被声明为 class 而不是 struct
  • 谢谢,我可以确认它被声明为一个类。我已经尝试过声明为类的其他对象,但没有任何工作
  • 我更新了代码以反映我所知道的问题。我正在尝试使用从 EF 存储库获取的数据更改模型。注释掉的代码有效。 EF 代码没有反映 Controller 端的变化

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


【解决方案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);
        }
    }
}

【讨论】:

  • 就是这样!我虽然 ref 关键字仅用于值类型。好的。所以总结一下。在注释掉的代码中,我只是更改了对象的值,但它的内存地址总是相同的,所以结果是肯定的。但是随后尝试从存储库中获取数据,它有效地应用了返回对象的内存地址,因此它不能反映在其他地方。感谢您对此的支持!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-22
  • 1970-01-01
  • 2012-01-19
  • 1970-01-01
相关资源
最近更新 更多