2017-02-09 5 views
2

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

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

К примеру, у меня есть ...

interface MonsterRecipe 

class KoboldRecipe implements MonsterRecipe 

class GoblinRecipe implements MonsterRecipe 

Первая часть этого разжиться массива классов рандомизации с.

Я пробовал let allRecipes = container.getAll(MonsterRecipe), но он возвращает 0 пунктов.

Я подозреваю, что мне может потребоваться определенная регистрация?

Если это полностью испорчено ... Есть ли другой способ получить случайный GoblinRecipe или KoboldRecipe, когда я попрошу MonsterRecipe.

ответ

1

Может быть, вы можете явно поместить их в массив:

export const RECIPES = [KoboldRecipe, GoblinRecipe]; 

И во время конфигурации:

container.registerHandler(MonsterRecipe, (container, key, resolver) => { 
    let random = RECIPES[Math.floor(Math.random() * RECIPES.length)]; 
    return new random(); 
}); 

(не Singletons здесь)

--edit:

Построение массива с помощью небольшого декоратора:

export const RECIPES: Function[] = []; 

function randomRecipe(target: Function) { 
    RECIPES.push(target); 
} 

export class MonsterRecipe { 
    getName() { 
     return "nothing"; 
    } 
} 

@randomRecipe 
export class KoboldRecipe extends MonsterRecipe { 
    getName() { 
     return "KoboldRecipe"; 
    } 
} 

@randomRecipe 
export class GoblinRecipe extends MonsterRecipe { 
    getName() { 
     return "GoblinRecipe"; 
    } 
} 
+0

Это позволило бы мне использовать контейнер. Но я надеялся уйти от создания собственного рецепта. :( – 4imble

+0

Не уверен, что это возможно с помощью TypeScript или aurelia. Я добавил пример с помощью декоратора, возможно, немного более изящным (только что заметил, что я использовал класс вместо интерфейса для MonsterRecipe, но он работает одинаково). – kdev