0

У меня возникли проблемы с выяснением того, как заставить Unity работать с моим общим хранилищем. Вот моя основная установка:Injection Dependency Injection - метод с общим типом возвращаемого репозитория

public static Repository<IEntity> GetRepository() 
{ 
    //This is of type CustomerRepository 
    return unitOfWork.CustomerRepository;   
} 


CustomerRepository : Repository<Customer>, ICustomerRepository 
Repository<TEntity> : IRepository<TEntity> where TEntity : class, IEntity 

ICustomerRepository : IRepository<Customer> 
IRepository<TEntity> : IDisposable where TEntity : class, IEntity 

Customer : IEntity 

Ошибка при возвращении unitOfWork.CustomerRepository является:

Не может неявно преобразовать тип 'CustomerRepository' в 'Repository'

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

container.RegisterType<IEntity, Customer>(); 
container.RegisterType(typeof(Repository<Customer>), typeof(CustomerRepository)); 
container.RegisterType(typeof(CustomerRepository), typeof(Repository<Customer>)); 

container.RegisterType(typeof(Repository<IEntity>), typeof(Repository<Customer>)); 
container.RegisterType(typeof(Repository<Customer>), typeof(Repository<IEntity>)); 


container.RegisterType(typeof(Repository<>), typeof(Repository<IEntity>)); 
container.RegisterType(typeof(Repository<IEntity>), typeof(Repository<>)); 

      //--------- 

container.RegisterType(typeof(IRepository<Customer>), typeof(Repository<IEntity>)); 
container.RegisterType<IRepository<Customer>, CustomerRepository>(); 
container.RegisterType(typeof(Repository<IEntity>), typeof(CustomerRepository)); 


      //-------------------- 
container.RegisterType(typeof(IRepository<>), typeof(Repository<>)); 
container.RegisterType<ICustomerRepository, CustomerRepository>(); 

container.RegisterType<IRepository<Customer>, ICustomerRepository>(); 
container.RegisterType<Repository<Customer>, CustomerRepository>(); 
container.RegisterType<IRepository<Customer>, CustomerRepository>(); 

container.RegisterType<IRepository<Customer>, ICustomerRepository>(); 
container.RegisterType<Repository<Customer>, CustomerRepository>(); 
container.RegisterType<IRepository<Customer>, CustomerRepository>(); 

container.RegisterType(typeof(IRepository<IEntity>), typeof(IRepository<Customer>)); 

Ни один из этих способов его регистрации не помогает.

EDIT 1:

Как я могу получить эту работу ?:

public static Repository<TEntity> GetRepository<TEntity>(string entityName, string conectionName) where TEntity : class, IEntity 
{ 
    var unitOfWork = new UnitOfWork(connectionName); 

    switch(entityName){ 
    case "Customer": 
      return unitOfWork.CustomerRepository; 
    } 

    return null; 
} 

ответ

0

Если я правильно понимаю, и сломать ваш код в несколько строк, вы делаете это:

public static Repository<IEntity> GetRepository() 
{ 
    CustomerRepository repository1 = unitOfWork.CustomerRepository; 
    Repository<IEntity> repository2 = repository1; 
    return repository2; 
} 

Так косвенно вы указываете значение типа CustomerRepository на тип Repository<IEntity>, что не сработает, начиная с Repository<IEntity> не является базовым типом CustomerRepository. С другой стороны, тип Repository<Customer> является базовым классом CustomerRepository, поэтому назначение CustomerRepository на Repository<Customer> будет работать.

* EDIT *

На основании ваших комментариев, некоторые новые идеи:

public static Repository<TEntity> GetRepository<TEntity>() 
    where TEntity : class, IEntity 
{ 
    if (typeof(TEntity) == typeof(Customer)) 
     return (Repository<TEntity>)(object)new Repository<Customer>(); 
    if (typeof(TEntity) == typeof(Product)) 
     return (Repository<TEntity>)(object)new Repository<Product>(); 
    throw new Exception("Entity of type " + typeof(IEntity).Name + " is not supported."); 
} 

Или ... с помощью отражения (медленнее):

public static Repository<TEntity> GetRepository<TEntity>() 
    where TEntity : class, IEntity 
{ 
    Type repositoryType = typeof(Repository<>).MakeGenericType(typeof(TEntity)); 
    return (Repository<TEntity>)Activator.CreateInstance(repositoryType); 
} 
+0

Да, это довольно что я делаю, но мне нужен тип возврата для того, чтобы этот метод был общим. Я думал, что смогу добиться этого с помощью инъекции зависимостей, но, полагаю, нет? Я также попытался это: 'открытые статические Repository GetRepository(), где TEntity: класс, IEntity' где оператор возврата: ' Repository repository2 = repository1; ' В основном я хочу, чтобы получить определенный репозиторий, основанный на параметрах и использующий его в общих чертах. Знаете ли вы, правильно ли это направление или как я могу добиться этого с помощью Unity? – nworbkcin

+0

Два отдельных вопроса: 1. Считаете ли вы, что сделать IRepository ковариантным? 2. Я предполагаю, что вы хотите вернуть «CustomerRepository», если для параметра «TEntity» установлено значение «Клиент». Почему в вашем примере вы всегда возвращаете 'CustomerRepository'? –

+0

Это упрощено, например, если у меня «TEntity» как «Клиент», я хочу «CustomerRepository». Если бы у меня «TEntity» как «Продукт», мне нужен «ProductRepository». Я просто вытащил все ненужные вещи, чтобы не отвлекать от своей реальной проблемы.Что вы подразумеваете под 'IRepository ' covariant? – nworbkcin