У меня возникли проблемы с выяснением того, как заставить 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;
}
Да, это довольно что я делаю, но мне нужен тип возврата для того, чтобы этот метод был общим. Я думал, что смогу добиться этого с помощью инъекции зависимостей, но, полагаю, нет? Я также попытался это: 'открытые статические Repository GetRepository(), где TEntity: класс, IEntity' где оператор возврата: ' Repository repository2 = repository1; ' В основном я хочу, чтобы получить определенный репозиторий, основанный на параметрах и использующий его в общих чертах. Знаете ли вы, правильно ли это направление или как я могу добиться этого с помощью Unity? –
nworbkcin
Два отдельных вопроса: 1. Считаете ли вы, что сделать IRepository ковариантным? 2. Я предполагаю, что вы хотите вернуть «CustomerRepository», если для параметра «TEntity» установлено значение «Клиент». Почему в вашем примере вы всегда возвращаете 'CustomerRepository'? –
Это упрощено, например, если у меня «TEntity» как «Клиент», я хочу «CustomerRepository». Если бы у меня «TEntity» как «Продукт», мне нужен «ProductRepository». Я просто вытащил все ненужные вещи, чтобы не отвлекать от своей реальной проблемы.Что вы подразумеваете под 'IRepository' covariant? –
nworbkcin