C# Скрытие полей из модели, где десериализация XML указывает на

У меня есть один класс контроллера, который имеет закрытое поле другого класса, который является моделью, моделью, которая получает данные из десериализации XML. Из-за этого процесса десериализации мне пришлось создать открытый конструктор без параметров и несколько открытых помощников полей, которые просто обрабатывают форматы данных для других типов. Эта обработка настолько проста, что я не хочу переписывать класс XmlSerialization, используя его интерфейс.
Чего я хочу добиться, так это иметь доступ к полям из модели только через интерфейс, который она наследует, но модель должна иметь открытые поля - как скрыть некоторые из них? Они в одном проекте. (Целое приложение настолько крошечно, что деление его на более мелкие части не всегда имеет смысл).

Вот пример:

public class Program
{
 public static void RequestHandler
 {
  
  public RequestHandler(string xmlRequest){
  IRequest request = DataModel.ParseXml(xmlRequest);
   
  //now user can use request from IRequest only
  //but when he doesn't know that he has to use IRequest he can easily access and change 
  //values in DataModel properties, I want to prevent such possibility
  
  }   
 }
}

public interface IRequest{
 
 int test_id { get; }
 DateTime description { get; }
 
 IRequest ParseXml(string request);
 bool Validate(IRequest request);
}

public class DataModel : IRequest {
 
 [XmlElement("testId")]
 int test_id { get; set; }
 
 [XmlElement("testId")]
 DateTime description { get; set; }

    public DataModel() {} //this has to be specified to be allowed to use Serialization
                          //I don't want users to be able to use this constructor, however it has to be public 
 
 IRequest static ParseXml(string request){
      
  // Xml Parsing process 
 }
 
 bool Validate(IRequest request) {
  
  //Process of checking if all data are available
 }
 

}

1 ответ

Можете ли вы сделать вашу модель 'Внутренней' и открыть все поля только через несколько интерфейсов и написать другой класс, который будет представлять ваши объекты модели через интерфейс. например

internal class DataModel : Interface1, Interface2 {

     internal DataModel(_xml)
     {
        this.xml = _xml;
     }

    private xml {get; set;}

    public Interface1.Property1 {get; set;}

    public Interface2.Property2 {get; set;}
}

//expose DataModel only via below Helper class
public class DataModelHelper {

   public Interface1 GetModel_1(string xml)
   {
    Interface1 i1 = new  DataModel(xml);
    return i1;
   }

   public Interface2 GetModel_2(xml)
   {
    Interface2 i2 = new  DataModel(xml);
    return i2;
   }
}
Другие вопросы по тегам