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