Не знаю, возможно ли это в LLGLGen, но что я обычно делаю при работе с ORM - это создание интерфейса с постоянным классом, в вашем примере IBook. Я выставляю этот интерфейс через публичный метод получения из класса-оболочки. Таким образом, если потребуется, вы можете расширить свой IBook так, как вам нужно, если вам нужно добавить какое-то пользовательское поведение в его поля.
Вообще говоря, я думаю, что есть 3 способа "привязки" ваших ORM-сущностей к вашему домену:
- То, как вы отправили. По сути, переназначить все снова
- Как я написал, выставьте ORM-сущность в качестве интерфейса
- Прямой доступ к ORM-сущности
Мне не нравится # 1, потому что мне не нравится иметь 2 сопоставления в моем приложении. СУХОЙ, ПОЦЕЛУЙ и ЯГНИ нарушаются этим.
Мне не нравится # 3, потому что это заставит любой потребительский уровень вашего доменного уровня напрямую взаимодействовать с уровнем ORM.
.. Итак, я иду с # 2, так как оно кажется меньшим из 3 зол;)
[Обновить] Небольшой фрагмент кода:)
ORM-сгенерированный класс на уровне данных:
public class Book : IBook
{
public string ISBN {get; private set;}
}
IBook находится на уровне бизнес-логики вместе с упаковщиком книг:
public interface IBook
{
string ISBN {get;}
}
public class BookWrapper //Or whatever you want to call it :)
{
//Create a new book in the constructor
public BookWrapper()
{
BookData = new Data.MyORM.CreateNewBook();
}
//Expose the IBook, so we dont have to cascade the ISBN calls to it
public IBook BookData {get; protected set;}
//Also add whichever business logic operation we need here
public Author LookUpAuther()
{
if (IBook == null)
throw new SystemException("Noes, this bookwrapper doesn't have an IBook :(")
//Contact some webservice to find the author of the book, based on the ISBN
}
}
Я не знаю, является ли это узнаваемый шаблон дизайна, но это то, что я использую, и до сих пор он работал довольно хорошо:)