我正在使用 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 是一种“违反良好做法”?
非常感谢您的推荐。
`
最佳答案
一个选择是制作内部
属性的set
并使用InternalsVisibleTo
属性以授予对存储库程序集内部的访问权限。
另一个不太技术性但更合乎逻辑的选择是将 setter 设为私有(private),并让修改它的唯一方法是类构造函数。这样,您的存储库可以构建用户,但以后没有人可以修改 ID。
作为最后一个选项,您可以创建一个接口(interface),该接口(interface)仅包含非存储库类应该访问的内容并传递它。我不是很喜欢,因为这意味着你必须将它转换回存储库中的具体类,这基本上意味着你的存储库在撒谎(说它接受 ISomething
,但如果ISomething
不是它所期望的准确、具体的 Something
。
关于c# - 限制对特定程序集的访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47469207/