【发布时间】:2017-11-24 08:30:48
【问题描述】:
我正在使用 sql server 开发一个 Winforms 项目,该项目被拆分为几个程序集。
第一个程序集Entities 包含 DTO,例如:
public class Attribution
{
public short UserId { get; set; }
public User User { get; set; }
}
public class User
{
public short Id { get; set; }
}
第二个程序集Repository 正在访问 Sql Server 数据库。
第三个程序集Service是前一个之间的链接。
还有其他层次,但这不是重点。我当然需要应用程序中的 DTO。
在sql server中,Attribution.UserId和User.Id是相同的数据,位于2个单独的表中,由Ìnner join链接。
Attribution.UserId 必须是公开的,因为我需要来自Repository、Service 等的访问权限……但我不需要在应用程序的“逻辑”部分使用它,我需要的是Attribution.User .
此时我有一个UserService 类,其中有一个GetUser() 方法,我调用此方法以在我的AttributionService.GetAttribution() 方法中获取用户。
有没有办法将对Attribution.UserId 属性的访问限制为Service 程序集?还是在AttributionService 类中查询User DTO 是一种“违反良好实践”的行为?
非常感谢您的推荐。
`
【问题讨论】:
-
I need of course DTO's everywhere in the app这是一件大事。我会推荐这篇文章 ;-) stackoverflow.com/questions/23648832/… 我会建议将你的图层分开。但;如果从一开始就没有这样做,那将是一个难以破解的难题。 -
除了@mjwills 的评论;您可以使内部组件对朋友程序集可见:docs.microsoft.com/en-us/dotnet/csharp/programming-guide/…
-
@Stefan。是的,我有 5 层,并且 DTO 在单独的程序集中,这就是为什么属性必须是公共的。例如,我需要
User在表单的组合框或控制器中... -
没有 mjwills,它不可能是
internal。必须从Service或Repository程序集访问属性。 -
添加一个接口,它只暴露你想暴露的东西。让您现有的类实现接口。在处理现有代码时,请传递具体类型。将其传递给“逻辑”代码时,改为传递接口。
标签: c# .net design-patterns .net-assembly