2014-10-07 4 views
1

у меня есть этот существующий кодRepository шаблон с общим интерфейсом и DI в EF

public interface IRepository<T> 
{ 
    void Create(T obj); 
    T Retrieve(string key); 
} 


public class ItemRepository : IRepository<Item> 
{ 
     public void Create(Item obj) 
     { 
      //codes 
     } 

     public Item Retrieve(string key) 
     { 
      //codes 
     }  
} 

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

public class Repository 
{ 
    IRepository<T> action = null; 
    public Repository(IRepository<T> concreteImplementation) 
    { 
     this.action = concreteImplementation; 
    } 

    public void Create(T obj) 
    { 
     action.Create(obj); 
    } 
} 

классы от EF. если для этого нет никакой работы, какой будет лучший подход?

ответ

2

Если я вас правильно понял вы хотите единое хранилище, которое может создать или восстановить объект любого типа путем делегирования конкретной реализации хранилища типа?

Как вы представляете, как это работает? вы определили этот класс Repository, но вам нужно создать конкретную реализацию фактического репозитория, чтобы использовать его, а затем все равно нужно создать экземпляр Repository в любом случае. Почему бы просто не использовать общую реализацию, которую вы должны создать в любом случае?

А как насчет вашего метода Retrieve? Как это будет выглядеть в вашем классе Repository? Вы только вернете Object? или вы сделаете свой метод общим?

Во всяком случае, чтобы ответить на ваш вопрос, вы можете сделать это, я полагаю:

public class Repository 
{ 
    IRepository action = null; 
    public Repository(IRepository concreteImplementation) 
    { 
     this.action = concreteImplementation; 
    } 

    public void Create<T>(T obj) 
    { 
     action.Create(obj); 
    } 
} 

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

public interface IRepository 
{ 
    void Create(object obj); 
    object Retrieve(string key); 
} 

Или, возможно, вы могли бы пройти по типу в метод Create вместо того, чтобы иметь общий параметр:

public class Repository 
{ 
    IRepository action = null; 
    public Repository(IRepository concreteImplementation, Type respositoryType) 
    { 
     this.action = concreteImplementation; 
     expectedType=repositoryType; 
    } 

    public void Create(Type type, Object obj) 
    { 
     if(type==expected && obj.GetType()==type) 
     { 
      action.Create(obj); 
     } 
    } 
} 

но оба эти ужасные идеи. Просто используйте generics и создайте репозиторий для каждого типа, это будет лучше всего в конечном итоге

+0

Я практиковал DI на основе этого http://www.codeproject.com/Articles/615139/An-Absolute-Beginners-Tutorial-on-Dependency-Inver , но он не применим к Generics. в любом случае спасибо за ответ. создание отдельных репозиториев будет для меня – Blues

0

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

Попробуйте добавить <T> к ней, как это:

public class Repository<T> 
{ 
    ... 
} 
+0

Да, я знаю, но если я укажу T и сделаю экземпляр этого, тогда тогда мне не нужно вводить конкретную реализацию, а i необходимо создать репозиторий для каждого объекта. ты знаешь какую-нибудь работу вокруг этого? – Blues