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