C# 是否使同一程序集中的另一个对象只能访问某个对象?
每个业务对象都有一个包含sql调用的匹配对象。我希望限制这些sql对象,使它们只能由匹配的业务对象使用。如何做到这一点 更新C# 是否使同一程序集中的另一个对象只能访问某个对象?,c#,.net,vb.net,accessor,C#,.net,Vb.net,Accessor,每个业务对象都有一个包含sql调用的匹配对象。我希望限制这些sql对象,使它们只能由匹配的业务对象使用。如何做到这一点 更新 格雷格提出了关于可测试性的观点。因为SqlObjects将包含非常特定于业务流程的sql,所以我不希望在多个buiness对象中重用它们。(基本CRUD操作都是由代码生成的)是否有办法使业务程序集中的一个业务对象(如yshuditelu和Greg Beech所示)只能访问SqlObjects,并将SqlObjects公开给单元测试程序集?如果这是您想要或需要采取的方法,您
格雷格提出了关于可测试性的观点。因为SqlObjects将包含非常特定于业务流程的sql,所以我不希望在多个buiness对象中重用它们。(基本CRUD操作都是由代码生成的)是否有办法使业务程序集中的一个业务对象(如yshuditelu和Greg Beech所示)只能访问SqlObjects,并将SqlObjects公开给单元测试程序集?如果这是您想要或需要采取的方法,您可以在业务对象中使sql对象成为私有类
public class BusinessObject
{
private class SqlObject { }
}
此外,通过使用分部类,如果需要,您可以将其分离到单独的文件中
//in one file
public partial class BusinessObject
{
//business object implementation
}
//in another file
public partial class BusinessObject
{
private class SqlObject { }
}
在下面的一条评论中提出了一个很好的观点:“SqlObject仍然可以从一个公共类型继承,比如连接信息可以在那些“内部”类之间共享。”这是绝对正确的,并且可能非常有益
为了响应您的编辑,单元测试只能测试公共类和函数(在测试中不使用反射)。我能想到的唯一办法是:
- 每个业务/sql对象对生成一个程序集
- 将
更改为私有类SqlObject
内部类SqlObject
- 然后对项目使用
[InternalsVisibleTo(“UnitTestsAssembly”)]
此外,此时您不必将sql对象保持为嵌套类。总的来说,我认为这可能会比它增加的价值增加更多的复杂性,但我完全理解每种情况都是不同的,如果您的需求/期望促使您这样做,我祝您一切顺利。就我个人而言,我认为我应该将SqlObjects公开(或内部具有对单元测试可见的内部构件),并接受这样一个事实,即这意味着sql类将向所有业务类公开。唯一的方法是将sql对象设为私有嵌套类型,即
public class BusinessObject
{
private class SqlObject
{
}
}
这是否是一个好的想法,从可测试性的角度来看,这完全是另一回事……< /P> < P>你正试图实现C++中的朋友类。据我所知,C#和VB.Net没有任何等价物。我唯一的建议是,将您希望限制的类设置为需要访问它的类的内部类。
您还可以使用两个程序集(一个用于业务对象,一个用于相关SQL对象),并在每个SQL类上使用内部修饰符,然后使用[InternalsVisibleTo(“BusinessObjectAssembly”)]
用于SQLAssembly。另外:SqlObject仍然可以从一个公共类型继承,这样连接信息就可以在这些“内部”类之间共享。谢谢。我已经在使用分部类生成代码了。我正在分离sql以进行依赖项注入。您的方法只需要对我的模板进行很少的更改!这是关于可测试性的一个很好的观点。有没有办法做到这一点并将SqlObject类公开给单元测试程序集,而不是其他业务对象?