Web API绑定不可变模型

ric*_*lla 7 c# model-binding asp.net-web-api

在我们的代码库中,DTO是具有只读字段的不可变类型,状态的getter和接受值的构造函数,因此假设的人类型如下所示:

public class Person
    {
        private readonly String _firstName;
        private readonly String _secondName;

        public Person(String firstName, String secondName)
        {
            _firstName = firstName;
            _secondName = secondName;
        }

        public String FirstName
        {
            get { return _firstName; }
        }

        public String SecondName
        {
            get { return _secondName; }
        }
    }
Run Code Online (Sandbox Code Playgroud)

使用Web API,是否可以绑定这样的模型而不暴露属性上的公共setter?

Pra*_*ose 16

是的,在没有公共属性的情况下绑定它是可能的.默认情况下,您需要一个公共设置器才能工作.但是,如果您有一个执行初始化的构造函数并且它是默认构造函数,则框架可以构造对象.

在您显示的示例中,由于只有一个构造函数接受两个字段(FirstName和LastName),因此它使用默认构造函数来创建对象.

这是因为Json序列化器的反序列化功能.如果您有多个构造函数,则可以使用JsonConstructor属性指定要使用的构造函数,并且可以设置只读字段.


Ed *_*nay 5

您可以通过将 WebAPI 请求绑定到一个模型来处理这个问题,并隐式转换为不可变类型:

public class PersonRequestModel
{
    public String FirstName { get; set; }
    public String SecondName { get; set; }

    public static implicit operator Person(PersonRequestModel request) {
        return new Person(request.FirstName, request.SecondName);
    }
}

public class Person
{
   private readonly String _firstName;
   private readonly String _secondName;

   public Person(String firstName, String secondName)
   {
       _firstName = firstName;
       _secondName = secondName;
   }

   public String FirstName
   {
       get { return _firstName; }
   }

   public String SecondName
   {
       get { return _secondName; }
   }
}
Run Code Online (Sandbox Code Playgroud)