【问题标题】:Restrict access to a specific assembly限制对特定程序集的访问
【发布时间】: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.UserIdUser.Id是相同的数据,位于2个单独的表中,由Ìnner join链接。

Attribution.UserId 必须是公开的,因为我需要来自RepositoryService 等的访问权限……但我不需要在应用程序的“逻辑”部分使用它,我需要的是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。必须从 ServiceRepository 程序集访问属性。
  • 添加一个接口,它只暴露你想暴露的东西。让您现有的类实现接口。在处理现有代码时,请传递具体类型。将其传递给“逻辑”代码时,改为传递接口。

标签: c# .net design-patterns .net-assembly


【解决方案1】:

一种选择是使属性internalset 并使用InternalsVisibleTo 属性来授予对存储库程序集内部的访问权限。

另一个技术含量较低但更合乎逻辑的选择是将 setter 设为私有,并让修改它的唯一方法是类构造函数。这样,您的存储库可以构建用户,但以后没有人可以修改 ID。

作为最后一个选项,您可以创建一个只包含非存储库类应该有权访问的接口并传递它。我不是一个超级粉丝,因为这意味着你必须将它转换回存储库中的具体类,这基本上意味着你的存储库在撒谎(说它接受 ISomething,但如果 ISomething 不是则抛出它所期望的准确、具体的Something)。

【讨论】:

  • 我在最后一个考虑过,但对我来说,DTO 的接口会增加这种使用的复杂性。
  • 我不确定是否理解第二个。我从存储库中获得了 Attribution DTO 和作为此 DTO 一部分的 UserId。我在构建 Attribution 时不知道这个 UserId。但也许我错了。我已经尝试了第一个解决方案,它似乎很容易实现和做到这一点。非常感谢您的帮助。
猜你喜欢
  • 2010-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-29
  • 2011-06-18
相关资源
最近更新 更多