2

我在另一个问题中提到了这个问题,但我认为值得将其分解为自己的问题,因为它并不真正依赖于我提到的其他场景。

无论如何-到Q上,不知道这是否可能。寻找解决方案/解决方法。

我有一个类库,除了 POCO 什么都没有:

MyCompany.MyProject.Domain.POCO

这个程序集有一个像这样的 POCO:

public class Post
{
   public int PostId { get; set; }
   public int Name { get; set; }
      ...
}

现在,我有另一个类库,它是我的 DAL/Repository,并使用 Entity Framework 4.0 进行持久性:

MyCompany.MyProject.Repositories

该程序集引用了 POCO 项目,因为它需要对 POCO 执行 CRUD 操作(获取 DB 对象、投影到 POCO、返回以及修改 POCO)。

现在,我还有一个Web Application,它引用了 POCO 和 Repository 程序集。

如果我这样做:

somePOCO.PostId = 10;

我得到一个 SQLException,因为PostId是数据库中的一个 IDENTITY 字段,因此不应该明确设置。

有没有办法可以隐藏这些特殊属性的设置器,以便只有存储库才能访问设置器?

我想不出一种使用常规可访问性修饰符的方法(因为它们都不适合这种情况),你们能想到一个解决方法吗?

4

3 回答 3

6

您可以将设置器设为内部,并使内部组件对存储库程序集可见

[assembly: InternalsVisibleTo("MyLibrary.Repositories")]
public class Post
{
   public int PostId { get; internal set; }
   public int Name { get; internal set; }
      ...
}

这意味着一切都可以“获取”这些属性,但只有这个程序集和包含存储库的程序集可以“设置”

于 2010-10-07T03:13:56.157 回答
2

将所有设置器标记为内部,然后将 InternalsVisibleTo 属性添加到您的 POCO 程序集:

 [assembly: InternalsVisibleTo( "MyCompany.MyProject.Repositories" )]  
于 2010-10-07T03:12:08.343 回答
1

卢克谢弗是一个很好的答案。它满足问题的技术要求。但我建议谨慎行事,因为这可能无法解决未来的问题。

不建议过度工程,但也许您可能想考虑进一步抽象出您对这些具有可设置 ID 属性的对象所做的事情。使用此属性装饰创建这种“可见性”可能就足够了,但我认为这有点解决问题。将这些对象之间的交互与其他东西封装起来可能会更干净,从而从消费代码中删除 setter 访问。

于 2010-10-07T03:26:45.760 回答