DAO в Scala с типами классов - PullRequest
       15

DAO в Scala с типами классов

4 голосов
/ 12 апреля 2011

Пусть мое приложение содержит бизнес-классы Order, Product, Customer и т. Д., И я хотел бы сохранить / извлечь их в / из базы данных.

Обычно для этой цели мы используем шаблон DAO. То есть мы определяем DAO интерфейс и реализацию для каждого бизнес-класса: OrderDAO, ProductDAO и т. Д. Теперь я хотел бы использовать шаблон типа pattern:

trait DAO[T] {
  def create(t:T)
  ... // other CRUD operations
}
...
// DAO implementations for specific business objects
implicit object OrderDAO extends DAO[Order] {
   def create(o:Order) {...}
   ... // other CRUD operations
}
...
// create a business object in the database
def create[T](t:T)(implicit dao:DAO[T]) {dao.create(t)}

Теперь моя проблема в том, что все DAOs используют экземпляр DataSource (фабрика соединений с базой данных), и поэтому я не могу определить DAOs как objects. Я должен создать одноэлементный экземпляр DataSource и передать его всем DAOs после их инициализации.

Допустим, у нас есть функция для создания DataSource:

def dataSource():DataSource = {...}
Как бы вы реализовали DAOs с классами типов ?

Ответы [ 3 ]

2 голосов
/ 12 апреля 2011

Я не думаю, что класс шрифтов - это путь сюда. Классы типов предназначены для описания возможностей, а не в качестве замены для DI.

Например, если ваш DAO выполняет запись в хранилище значений ключей, может потребоваться возможность преобразования класса в карту ключей и значений.

В таком случае класс типа:

trait KeyValuable[T] {
  def toMap(t: T): Map[String, String]
}

И очевидно, что вы можете предоставить каждому бизнес-классу правильную реализацию независимо от среды. Это наследуемая возможность типа, не привязанная к тому, как вы потом ее используете.

1 голос
/ 12 апреля 2011

Согласен с Сашей. Подъемный путь должен работать:

trait DataSource

class MyDataSource extends DataSource

object DataSources {
  @volatile var dataSource: () => DataSource = () => new MyDataSource
}

При таком подходе вы можете использовать object без потери тестируемости.

1 голос
/ 12 апреля 2011

Как насчет создания объекта, который содержит все ваши DAO и инициализирует их с вашим источником данных?Дополнительное косвенное обращение, но это будет работать.

Я не знаю (пока), как лучше всего бороться с инъекцией зависимостей в Scala, но это может сработать и для вас: http://www.assembla.com/wiki/show/liftweb/Dependency_Injection

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...