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
有自己的程序集,该怎么办?