Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 向服务层传递模型和从服务层传递模型_C#_Architecture_Soa - Fatal编程技术网

C# 向服务层传递模型和从服务层传递模型

C# 向服务层传递模型和从服务层传递模型,c#,architecture,soa,C#,Architecture,Soa,假设我有一个模型: public class Thing { public int? identifier { get; set; } public string Title { get; set; } public string Description { get; set; } ... // arbitrary number of additional properties. } 以及服务层的接口,其中包含两个关键方法: public interface I

假设我有一个模型:

public class Thing
{
    public int? identifier { get; set; }
    public string Title { get; set; }
    public string Description { get; set; }
    ... // arbitrary number of additional properties.
}
以及服务层的接口,其中包含两个关键方法:

public interface IThingService
{
    Thing GetThing(int id);
    Thing AddThing(Thing thing);
}
现在,假设服务层将在
AddThing
时自动为每个事物生成
标识符。还假设将此
标识符
公开给表示层很重要,因为它可能会传递给其他服务

考虑到我必须将
对象
传递给
添加对象
,这是建模
对象
的最佳方式吗?表示层的开发人员可能会认为他们可以指定一个
标识符
,但是
的具体实现会忽略这一点。当然,
identifier
必须是公共的,才能由
IThingService
getting
设置


忽略调用
AddThing
时传递的
标识符可以吗,或者有更好的方法对此建模以防止这种情况发生吗?

我认为在这种情况下,AddThing的正确签名将是AddThing(字符串标题、字符串描述)方法的职责是使用生成的标识符构建Thing对象


考虑到您的上一个规范,我建议制作第二个类,用ID作为成员标识符和东西。AddThing的签名将更改为ThingWithId AddThing(Thing Thing)

只有当服务在原始
Thing
实际存在的同一内存上运行时,此功能才有效。如果此服务断开连接,例如在另一台机器上,则更新
东西将不会影响原始实例,并且
标识符将永远不会返回到调用代码

考虑到这一点,有两种可能的路径:您希望此服务始终是本地的,并在与调用应用程序相同的内存上运行,或者您希望此服务实际断开或最终断开连接

有联系的 如果已连接,此接口将正常工作,但您可能仍希望隐藏标识符的setter。如果这样做,您可以将其设置为内部,并在单独的程序集中定义服务接口和
对象,这将使setter对表示层不可访问。几乎,您仍然可以通过反射或其他hijinks调用它,但对于典型的东西,它将无法访问

断开的 此接口刚刚中断,因为您无法以任何方式检索标识符,并且为了检索现在保存的项,必须使用此接口。这里的典型解决方案是从
AddThing
方法返回标识符,或者返回整个对象(新内存),如果它足够小的话


除此之外,不可变的数据项很难解释,在这两种情况下,我可能更愿意在调用
AddThing
后创建一个新的
东西。

您的服务应该如下所示:

public interface IThingService
{
    Thing GetThing(int id);
    ThingCreationResponse AddThing(ThingCreationRequest request);
}
ThingCreationRequest
将拥有创建
对象
实体所需的所有数据。它没有标识符。标识符将由
AddThing
返回

AddThing
可以简单地返回一个
Thing
id,但是在这种情况下,您应该提供一个记录良好的协议来传递错误(在出现故障时返回负值,或者抛出异常)


返回
ThingCreationResponse
的实例将为您提供更好的灵活性,因为您可以返回新
事物的id或完整实例
,也可以更好地传达失败原因。

感谢您的响应-这是最初的计划;然而,
Thing
可能比两个属性要复杂得多-应该在问题中明确这一点。你好,Nick,我修改了我的问题,以便
AddThing
返回
Thing
的新实例(无论如何,应用程序中实际上是这样建模的)。那么您认为将
标识符定义为
公共int是合适的吗?标识符{get;internal set;}
?如果
IThingService
Thing
在同一程序集中定义,但
ActualThingService
有自己的程序集,该怎么办?