2017-02-22 17 views
0

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

я в настоящее время он работает так:

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

Назвать это так:

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

Это работает, но я предпочел бы не объявить тип возвращаемого значения. Я хотел бы назвать это так:

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

Это не очень важно, но это только беспокоит меня, и мне очень интересно, если есть какие-либо очевидные решения.

+2

Какой тип должен построить завод? Должен ли он искать загруженные сборки для типов, реализующих интерфейс 'IRepository '? –

+0

Не уверен, что это риторический вопрос, но да, он должен вернуть реализацию IRepository , так как есть только один из них. e: Я все еще студент, и это очень возможно. Я немного забываю о чем-то, что может быть очевидно для других. – ihendriks

+0

На фабрике вы можете создать частный словарь ('Dictionary '), который отображает различные типы 'T' и соответствующие им типы репозитория. Затем, когда вас попросят построить репозиторий, вы можете использовать словарь для получения типа репозитория, а затем использовать отражение для создания типа репозитория. –

ответ

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>(); 
    } 
} 

Тогда, назовем его так:

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

В моих реализациях не используются дженерики, и я не вижу, как реализовать свое предложение. Мой impl такой: 'public class InvoiceRepository: IRepository {// ..}'. Я не знаю, помогает ли это. – ihendriks

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