2015-04-13 10 views
4

В нашем кодовых базах DTOS Web API являются неизменными типами с только для чтения полей, добытчики для государства и конструктора, который принимает значения, так гипотетический тип лица выглядит следующим образом:связывания неизменных моделей

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; } 
     } 
    } 

С помощью Web API , можно ли связать такую ​​модель, не подвергая публичные сеттеры свойствам?

+1

Я не думаю, что так. DefaultModelBinder попытается связать свойство на основе имени свойства. здесь в вашем случае FirstName и LastName. но поскольку у вас нет свойства setter, оно должно вызывать исключение. Но я позволю эксперту сказать об этом. :) – Mukund

+0

richzilla: Я в той же ситуации, интересно, как вы решили эту проблему? Я использую Web Api 2 и хотел бы использовать неизменяемую модель класса. –

ответ

7

ДА, ВОЗМОЖНО, чтобы связать это без общедоступных объектов. По умолчанию для этого вам понадобится публичный сеттер. Однако, если у вас есть конструктор, который выполняет инициализацию, и он является стандартным, инфраструктура может создавать объекты.

В примере, который вы указали, поскольку существует только один конструктор, который принимает оба поля (FirstName и LastName), он использует конструктор по умолчанию для создания объекта.

Это работает из-за возможностей де-сериализации сериализатора Json. Если у вас есть несколько конструкторов, вы можете использовать атрибут JsonConstructor, чтобы указать, какой конструктор использовать, и который может устанавливать ваши поля только для чтения.

2

Вы могли бы иметь дело с этим, имея модель, которую вы связать ваш запрос 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; } 
    } 
} 
Смежные вопросы