我在my other question中提到了这个问题,但我认为值得将其分解为自己的问题,因为它并不真正依赖于我提到的其他情况。
无论如何 - 在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应用程序,它引用了POCO和Repository程序集。
如果我这样做:
somePOCO.PostId = 10;
我得到一个SQLException,因为 PostId 是数据库中的IDENTITY字段,因此不应该明确设置。
有没有办法可以隐藏这些特殊属性的setter,以便只有存储库才能访问setter?
我想不出用常规辅助功能修饰符来实现它的方法(因为它们都不适合这种情况),你们能想到一个解决方法吗?
答案 0 :(得分:6)
您可以将setter设置为内部,并使内部组件对存储库程序集可见
[assembly: InternalsVisibleTo("MyLibrary.Repositories")]
public class Post
{
public int PostId { get; internal set; }
public int Name { get; internal set; }
...
}
这意味着一切都可以“获取”这些属性,但只有这个程序集和包含存储库的程序集才能“设置”
答案 1 :(得分:2)
将所有setter标记为内部,然后将InternalsVisibleTo属性添加到POCO程序集:
[assembly: InternalsVisibleTo( "MyCompany.MyProject.Repositories" )]
答案 2 :(得分:2)
Luke Schafer's是一个很好的答案。它满足了问题的技术要求。但我建议谨慎,因为这可能无法解决未来的问题。
不建议过度工程,但也许您可能想要考虑使用具有可设置ID属性的这些对象进一步抽象您正在做的事情。使用此属性修饰创建此“可见性”可能就足够了,但我认为这对于该问题来说是一种破解。将这些对象之间的交互与其他对象封装起来可能更清晰,从而消除了setter访问消费代码。