У меня есть interafes классов и выше в моем проекте:Как зарегистрировать типов различного конструктор параметра [Unity IoC]
public interface IRepositoryBase<T> : IDisposable where T : class { }
public interface IUserRepository : IRepositoryBase<User> { }
public interface IPaymentRepository : IRepositoryBase<Payment> { }
public class SecurityContext : DbContext { }
public class FinanceContext : DbContext { }
public class RepositoryBase<T> : IRepositoryBase<T> where T : class
{
public RepositoryBase(DbContext context) { }
}
Я пытаюсь придать правильную DbContext к объектам, созданным с IUserRepository х IPaymentRepository интерфейсы:
- IUserRepository -> должны быть решены в новом RepositoryBase (новый SecurityContext())
- IPaymentRepository -> должны быть решены как новые RepositoryBase (новый FinanceContext())
Я попробовал этот код без успеха:
container.RegisterType<IUserRepository, RepositoryBase<User>>(
new InjectionConstructor(container.Resolve<SecurityContext>()));
... и получил следующую ошибку
типа 'RepositoryBase' не может быть используется как параметр типа «TTo» в общем типе или методе «Microsoft.Practices.Unity.UnityContainerExtensions.RegisterType (Microsoft.Practices.Unity.IUnityContainer, params Microsoft.P ractices.Unity.InjectionMember []). Нет никакого неявного преобразования ссылок из 'RepositoryBase' в 'IUserRepository'.
[EDIT] Я изменил подход, как предложил Георг и это работает прекрасно.
После устранения интерфейсов IUserRepository и IPaymentRepository Я зарегистрировал тип следующим образом:
container.RegisterType<IRepositoryBase<User>, RepositoryBase<User>>
(new InjectionConstructor(typeof(SecurityContext)));
Наконец я должен был изменить свою Услугу делат IRepositoryBase впрыскивается в конструкторе.
public class UserService : IUserService
{
private readonly IRepositoryBase<User> _repository;
public ColaboradorService(IRepositoryBase<User> repository)
{
_repository = repository;
}
}
Звучит как проблема ковариации/контравариантности, попробуйте следующее: http://tomasp.net/blog/variance-explained.aspx/ – Charleh