gpt4 book ai didi

c# - 如何在 WCF 中使用 DomainModel

转载 作者:太空宇宙 更新时间:2023-11-03 23:19:06 25 4
gpt4 key购买 nike

背景:我需要发布一个简单的项目,它将用于将数据从我的存储传输到其他地方(将使用我的 WCF 的其他开发人员。WCF 将用于传输数据(保护 DB 等) . 我在我的项目(基础部分)中使用了洋葱架构。

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

我用一个简单的例子来展示我的问题:

我有这样的 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);
}
}

我得到这个异常:这可能是由于服务端点绑定(bind)未使用 HTTP 协议(protocol)。这也可能是由于 HTTP 请求上下文被服务器中止(可能是由于服务关闭)。有关详细信息,请参阅服务器日志。

如果我在此更改 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;} }
}

我没有执行权限,但我违反了 S.O.L.I.D 原则。

我不想将 set 添加到 DomainModel 中,我建议解决此问题的更好方法是在 DomainModel 和 WCF 之间创建一个传输层。

如果您能根据您的经验告诉我您的想法,我将不胜感激。

最佳答案

您可以为该属性提供一个私有(private) setter 。这样数据协定序列化器应该仍然能够序列化对象,但您不会将属性的 setter 暴露给域模型之外的任何代码。

或者,您可以实现一个数据传输对象,它实际上只是一个具有一组公共(public) getter 和 setter 的类,并将其用作您的 WCF 数据协定。我想这个选项的缺点是您必须编写一些映射代码或使用自动映射工具在您的域模型和数据传输对象之间进行映射。

关于c# - 如何在 WCF 中使用 DomainModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36082629/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com