2016-03-18 1 views
1

Справочная информация. Мне нужно выпустить простой проект, который будет использоваться для транспортировки данных из моего хранилища в другое место (другие разработчики, которые будут использовать мой WCF. WCF будет использоваться для транспортировки данных (To . защиты БД и так далее) я использовал лук архитектуру в моем проекте (базовые части)Как использовать DomainModel Into WCF

-------------------------------------- 
|    WCF     | 
| ---------------------------------- | 
| | Interfaces for working with DB | |  
| |  -------------   | | 
| |  |DomainModel|   | | 
| |  -------------   | | 
| -----------------------------------| 
-------------------------------------- 

я показать мои problen на простом примере:.

у меня DomainModel так:

[DataContract] 
public class User 
{ 
    private string _name; 
    private List<Text> _texts; 

    public User(string name, List<Text> texts) 
    { 
     _name = name; 
     _texts = texts; 
    } 
    [DataMember] 
    public string Name { get { return _name; } } 
    [DataMember] 
    public List<Text> Texts { get { return _texts; } } 
}  


[DataContract] 
public class Text 
{ 
    private string _name; 

    public Text(string name) 
    { 
     _name = name; 
    } 

    [DataMember] 
    public string Name { get { return _name; } } 
} 

службы WCF есть этот метод:

public DomainModel.User ReturnUser() 
    { 
     User user = new User("Texts", 
      new List<Text>() 
      { 
       new Text("TextOne"), 
       new Text("TextTwo") 
      }); 

     return user; 
    } 

Но когда я вызываю метод

static void Main(string[] args) 
{ 
    try 
    { 
     ServiceRomanClient client = new ServiceRomanClient(); 
     User user = client.ReturnUser(); 
     Console.WriteLine(user.Name); 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex.Message); 
    } 
} 

Я получаю это исключение: Это может быть связано с сервисной конечной точки связывания не с использованием протокола HTTP. Это также может быть связано с тем, что контекст HTTP-запроса прерывается сервером (возможно, из-за отключения службы). Подробнее см. Журналы сервера.

Если изменить Propertis в DomainModel на этом (я добавил набор)

[DataContract] 
public class User 
{ 
    private string _name; 
    private List<Text> _texts; 

    public User(string name, List<Text> texts) 
    { 
     _name = name; 
     _texts = texts; 
    } 
    [DataMember] 
    public string Name { get { return _name; } set{ _name = value; } } 
    [DataMember] 
    public List<Text> Texts { get { return _texts; } set { _texts = value; } } 
} 

[DataContract] 
public class Text 
{ 
    private string _name; 

    public Text(string name) 
    { 
     _name = name; 
    } 

    [DataMember] 
    public string Name { get { return _name; } set{ _name = value;} } 
} 

Я не не имеют execption, но я нарушу S.O.L.I.D principels.

Я хочу не добавлять набор в DomainModel, я предлагаю, чтобы лучший способ решить эту проблему - создать транспортный уровень между DomainModel и WCF.

Буду признателен, если вы сможете дать мне свои мысли из своего опыта.

ответ

3

Вы можете предоставить собственность частным сеттерам. Таким образом, сериализатор данных должен по-прежнему иметь возможность сериализовать объект, но вы не подвергаете установщик свойства любому коду вне модели домена.

В качестве альтернативы вы можете реализовать объект передачи данных, который фактически представляет собой класс с кучей публичных получателей и сеттеров, и использовать это как ваш контракт с данными WCF. Я полагаю, что недостатком этой опции является то, что вам нужно будет написать код сопоставления или использовать инструмент автоматического сопоставления для сопоставления между моделью вашего домена и объектом передачи данных.

+0

Такое четкое и простое решение. Большое спасибо. Я добавил частный набор {_name = value; } –

Смежные вопросы