Я работаю над своим первым проектом .NET (.NET 3.5, ADO.NET и C#). Мы построили наши модели сущностей и пытаемся создать чистый слой бизнес-объектов.
У нас есть базовая модель объекта, и мы хотим добавить определенную семантику бизнес-уровня к средствам доступа к данным по умолчанию (свойствам навигации и т. д.).
Например, предположим, что у нас есть отношение «многие ко многим» между Person и BankAccounts. Предположим, что на бизнес-уровне мы хотели бы добавить возможность заморозить учетную запись. Теперь нам нужна возможность перехода от Person к:
- все их банковские счета,
- их незаблокированные банковские счета, и
- их замороженные банковские счета.
Естественно, мы хотели бы сделать номинальный случай значением по умолчанию: если я перехожу 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, которое, по-видимому, подразумевает, что нет хорошего способа добавить четкое разделение проблем.