Если вы хотите или должны использовать этот подход, вы можете сделать объекты 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 все еще может наследовать от общего типа, так как такие вещи, как информация о соединении, могут совместно использоваться этими« внутренними »классами». это абсолютно верно и потенциально очень полезно.
В ответ на ваши изменения модульные тесты могут тестировать только публичные классы и функции (без использования отражения в ваших тестах). Единственный вариант, который я могу придумать, это сделать:
- сделать одну сборку на пару объектов business / sql
- изменение
private class SqlObject
на internal class SqlObject
- затем используйте
[InternalsVisibleTo("UnitTestsAssembly")]
для проекта
Кроме того, на этом этапе вам не нужно будет хранить объект sql как вложенный класс. Вообще говоря, я думаю, что это, вероятно, добавит больше сложности, чем ценность, которую я добавляю, но я полностью понимаю, что каждая ситуация различна, и если ваши требования / ожидания ведут вас к этому, я желаю вам всего наилучшего. Лично я думаю, что хотел бы сделать SqlObjects общедоступными (или внутренними с внутренностями, видимыми для модульного тестирования) и принять тот факт, что это означает, что классы sql доступны всем бизнес-классам.