2010-08-10 9 views
0

Quelle est la manière correcte de fournir des valeurs à une méthode d'usine abstraite?Conception de classe selon IoC et modèle d'usine abstraite

Par exemple.

interface IFactory 
{ 
    ISomething Create(int runTimeValue); 
} 

class Factory : IFactory 
{ 
    public ISomething Create(int runTimeValue) 
    { 
    return new Something(repository, runTimeValue); 
    } 
} 

Dans l'exemple, le dépôt est injecté par le constructeur lorsque l'usine est créé, mais je pouvais à la place déplacer le référentiel à l'interface IFactory

interface IFactory 
{ 
    ISomething Create(IRepository repository, int runTimeValue); 
} 

class Factory : IFactory 
{ 
    public ISomething Create(IRepository repository, int runTimeValue) 
    { 
    return new Something(repository, runTimeValue); 
    } 
} 

Ce qui est considéré comme « bonne » façon de le faire? Comment doit-on raisonner lors de la conception d'une usine abstraite?

Répondre

0

Abstract Factory pattern doit être utilisé dans les cas où les objets retournés par l'usine doivent être "initialisés" différemment de telle sorte que seule l'usine sache comment le faire. Ainsi, différentes implémentations de quelque chose seront "initialisées" ou créées différemment et seules leurs implémentations Factory respectives savent comment le faire.

Dans votre cas, vous devez vous demander:

Est-ce que toutes les implémentations de ISomethings besoin du IRepository ainsi que runtimeValue ?. Dans ce cas, vous pouvez simplement utiliser le modèle d'usine.

Utiliser Abstract Factory dans un tel scénario: (Quelque chose et SomeOtherthing sont créés différemment)

interface IFactory { 
    ISomething Create(int runTimeValue); 
} 

class Factory : IFactory { 
    public ISomething Create(int runTimeValue) { 
    return new Something(repository, runTimeValue); 
    } 
} 

class OFactory : IFactory { 
    public ISomething Create(int runTimeValue) { 
    // constructor takes different parameters 
    SomeOtherthing thing = new SomeOtherthing("someValue", runtimeValue); 
    thing.SetCustomRepository(new OtherRepositoryImpl()); 
    return thing; 
    } 
} 
+0

Merci, cela aide :) – Marcus

+0

Comment testeriez-vous cette unité? OtherRepositoryImpl est une implémentation concrète .... – danidacar

0

Je dirais être cohérent. Si votre référentiel est injecté partout ailleurs, il serait judicieux de l'injecter dans le constructeur de l'usine plutôt que d'en faire une partie de l'interface.