2017-02-22 2 views
0

Ich versuche, eine Fabrik zu implementieren, die eine Klasse basierend auf dem generischen zurückgibt, mit dem es aufgerufen wird.Factory konkrete Rückgabetyp auf generische

Ich habe es zur Zeit wie folgt arbeiten:

public static TRepository GetInstance<T, TRepository>() 
    where TRepository : IRepository<T>, new() 
{ 
    return new TRepository(); 
} 

es wie folgt aufrufen:

InvoiceRepository repo = RepositoryFactory.GetInstance<Invoice, InvoiceRepository>(); 

Dies funktioniert, aber ich möchte lieber nicht den Rückgabetyp deklarieren müssen. Ich möchte es so nennen:

InvoiceRepository repo = RepositoryFactory.GetInstance<Invoice>(); 

Es ist nicht wirklich wichtig, aber es stört mich einfach und ich bin gespannt, ob es irgendwelche offensichtlichen Lösungen.

+2

Welche Art sollte die Fabrik bauen? Sollte es die geladenen Assemblies nach Typen durchsuchen, die die 'IRepository ' Schnittstelle implementieren? –

+0

Nicht sicher, ob das eine rhetorische Frage ist, aber ja, es sollte die Implementierung von IRepository zurückgeben, da es nur eine von jedem gibt. e: Ich bin immer noch Student und es ist sehr wahrscheinlich, dass ich etwas nicht wahrnehme, was für andere offensichtlich ist. – ihendriks

+0

Sie können in der Factory ein eigenes Wörterbuch ('Dictionary ') erstellen, das zwischen verschiedenen 'T's und den entsprechenden Repository-Typen mappt. Wenn Sie dann aufgefordert werden, das Repository zu erstellen, können Sie das Verzeichnis verwenden, um den Typ des Repositorys abzurufen, und dann mithilfe der Reflektion den Repository-Typ erstellen. –

Antwort

0
public interface IRepository<T> 
{ 
} 

public class Repository<T> : IRepository<T> 
{ 

} 

public static class RepositoryFactory 
{ 
    public static IRepository<T> GetInstance<T>() 
       where T : new() 
    { 
     return new Repository<T>(); 
    } 
} 

Dann rufen Sie es wie folgt aus:

var repo = RepositoryFactory.GetInstance<Invoice>(); 
+0

Meine Implementierungen verwenden keine Generika, und ich sehe nicht, wie ich Ihren Vorschlag umsetzen würde. Mein impl ist wie folgt: 'public class InvoiceRepository: IRepository {// ..}'. Ich weiß nicht, ob das hilft. – ihendriks

Verwandte Themen