2014-03-06 2 views
0

У меня есть некоторые объекты, которые я хочу подключить динамически к моему приложению Play. И один главный объект, который контролеры им:Динамически создавать объекты по полному имени, указанному в файле

trait MyObjectTrait { 
    def run(): Unit 
} 

object MyObject1 extends MyObjectTrait { 
    //...... 
} 

object MyObject2 extends MyObjectTrait { 
    //...... 
} 

object MyObject3 extends MyObjectTrait { 
    //...... 
} 

object Manager { 
    def runAll(): Unit = { 
    val objects = getObjects() 
    objects foreach run 
    } 
} 

Я хочу, чтобы иметь возможность быть определить, какие из них являются активными в мое приложение, указав их в конфигурационном файле:

<objectsToRun> 
    <add name="obj1" fullName="myapp.modules.module1.MyObject1" /> 
    <add name="obj2" fullName="myapp.modules.module112.MyObject2" /> 
    <add name="obj3" fullName="myapp.modules.module143.MyObject434" /> 
    <add name="obj4" fullName="myapp.modules.module14343.MyObject66" /> 
</objectsToRun> 

Дело отметить, , Manager.runAll будет использоваться довольно часто, примерно 1 раз в минуту. Поэтому я хотел бы кэшировать динамически созданные объекты (а не результат запустите каждого из них), читайте из config. Обратите внимание, что список объектов не будет часто меняться, в большинстве случаев он будет таким же.

  1. Каков же идиоматический способ сделать это?
  2. Какой файл следует использовать, где я могу записать объекты, которые я хочу создать?
  3. Как я могу динамически создавать объект и кэшировать его?

ответ

2

Ну нормально для таких вещей: инъекции зависимостей Spring's звучит идеально, где пружина создает бобы и обеспечивает его непосредственно, не беспокоясь о разборе файла и т.д. Хотя это может/не может быть уместно в вашем случае. Зависит от масштаба проекта и насколько он вам действительно нужен. В игре я не уверен в том, как это сделать (Кто-то может дать свой вклад).

Как я могу динамически создать объект и кешировать его?

Ну, классный загрузчик достаточно умен, чтобы решить эту проблему, и будет загружать классы (и, следовательно, объект singleton), когда они будут использоваться в первый раз. Например, рассмотрим ниже:

object T{ 
     def main(args:Array[String]){ 
       println("1") 
       println(E.num); 
     } 
} 

object E{ 
     println("hey") 
     def num = 23 
} 

На работающем:

[email protected]:~/Documents/temp$ scala T 
1 
hey 
23 

Вы видите hey печатается только E используется впервые. Итак, ответ: вам не нужно беспокоиться о динамическом его создании, просто используйте его, когда вам это нужно.

Какой файл следует использовать, где я могу записать объекты, которые я хочу создать ?

Ну, опять же, это зависит от того, какое у вас больше в этом файле. Для простоты json? И тогда я бы:

object Manager { 
    lazy val ls = //list of all `objectsToRun` after reading from file 
    lazy val objects = ls.map{x => x match { 
     case "MyObject1" => whatever.package.MyObject1 
     case ... 
    }} 

    def runAll(): Unit = { 
    objects foreach run 
    } 
} 
+0

Спасибо. Но я сомневаюсь также в том, как кэшировать этот «lazy val ls = // список всех вызовов« objectsToRun »после чтения из файла»? –

+0

Кроме того, случай «MyObject1» => whatever.package.MyObject1 подразумевает, что я должен знать имена изначально. Это жесткий код, а не СУХОЙ. что, если я не знаю имена изначально? –

Смежные вопросы