每个业务对象都有一个包含sql调用的匹配对象。我想限制这些sql对象,它们只能由匹配的业务对象使用。如何实现这一目标?
更新
Greg提出了关于可测试性的观点。由于SqlObjects将包含非常特定于业务流程的sql,因此我不希望它们在多个buiness对象中重用。 (基本的CRUD操作都是代码生成的)是否有办法使SqlObjects只能访问业务程序集中的一个业务对象(如yshuditelu和Greg Beech所示)并将SqlObjects暴露给单元测试程序集?
答案 0 :(得分:9)
如果这是您想要或需要采用的方法,则可以在业务对象中使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 { }
}
Joel在下面的评论中提出了一个很好的观点:“SqlObject仍然可以继承公共类型,因为连接信息可以在这些”内部“类之间共享。”这绝对是真的,而且可能非常有益。
为了响应您的编辑,单元测试只能测试公共类和函数(在测试中不使用反射)。我能想到的唯一选择就是:
private class SqlObject
更改为internal class SqlObject
[InternalsVisibleTo("UnitTestsAssembly")]
作为项目此外,此时您不必将sql对象保留为嵌套类。一般来说,我认为这可能会增加比它增加的价值更多的复杂性,但我完全理解每种情况都不同,如果你的要求/期望推动了你,我祝你好。就我个人而言,我认为我会将SqlObjects公开(或者内部内部可见单元测试),并接受这意味着sql类暴露给所有业务类。
答案 1 :(得分:4)
唯一的方法是使SQL对象成为私有嵌套类型,即
public class BusinessObject
{
private class SqlObject
{
}
}
从可测试性的角度来看这是一个好主意完全是另一回事......
答案 2 :(得分:0)
您正在努力在C ++中实现什么是朋友类。据我所知,C#和VB.Net没有任何等价物。我唯一的建议是让你想要的类限制需要访问它的类的内部类。
答案 3 :(得分:0)
您还可以使用两个程序集(一个用于业务对象,一个用于相关的SQL对象),并在每个SQL类上使用内部修饰符,然后使用[InternalsVisibleTo("BusinessObjectAssembly")]
作为SQLAssembly。