Я работаю над своим первым проектом .NET (.NET 3.5, ADO.NET и C #). Мы создали наши модели сущностей и пытаемся создать чистый слой бизнес-объектов.
У нас есть базовая модель сущностей, и мы хотим добавить определенную семантику бизнес-уровня в средства доступа к данным по умолчанию (свойства навигации и т. Д.).
Например, давайте предположим, что у нас есть отношение многие ко многим между Person
и BankAccounts
. Давайте предположим, что на бизнес-уровне мы хотели бы добавить возможность заблокировать учетную запись. Теперь нам нужна возможность навигации от человека к:
- все их банковские счета,
- их незамерзающие банковские счета и
- их замороженные банковские счета.
Естественно, мы хотели бы установить номинальный регистр по умолчанию: если я перейду на Person.BankAccounts()
, я бы хотел, чтобы он возвращал их не замороженные аккаунты. Я мог бы добавить свойства навигации Person.FrozenBankAccounts()
и Person.AllBankAccounts()
.
Оба подхода, которые мы придумали, похоже, имеют достаточное количество запаха кода.
- Мы не можем найти способ переопределить методы модели сущностей. Поэтому оставьте
Person.BankAccounts()
в качестве средства доступа, которое возвращает все банковские счета. Затем мы добавляем Person.FrozenBankAccounts()
и Person.NonFrozenBankAccounts()
.
- Добавьте еще один явный слой к базе кода, который оборачивает все обращения к
BankAccounts
.
При подходе 1 проблема заключается в том, что номинальное экономическое обоснование (доступ к незамерзшим банковским счетам) является наиболее неинтуитивным названием метода лота.
При подходе 2, когда мы создаем подклассы объектов из слоя модели сущностей, мы должны переопределить каждый метод, чтобы гарантировать, что он не вернет объекты из нижележащего слоя. Итак, мы создаем BL_Person
, который имеет метод BankAccounts()
, который возвращает коллекцию BL_BankAccount
объектов. Но в этом случае весь этот код кажется немного глупым.
Есть ли лучший подход, чем два, которые мы рассмотрели? Если нет лучшего подхода, какой из двух описанных мною кажется лучшим решением (учитывая, что у нас есть что-то вроде 50+ классов, с которыми нам нужно работать)?
Примечание: Во время поиска в Интернете я обнаружил открытое письмо в Microsoft под названием ADO .NET Entity Framework Голосование об отсутствии доверия , в котором, как представляется, нет хороший способ добавить четкое разделение проблем.