我的项目中有上述的interfes和类:
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 e IPaymentRepository接口创建的对象中:
我尝试了以下代码但没有成功:
container.RegisterType<IUserRepository, RepositoryBase<User>>(
new InjectionConstructor(container.Resolve<SecurityContext>()));
...并收到以下错误
'RepositoryBase'类型不能用作类型参数'TTo' 在泛型类型或方法中 “Microsoft.Practices.Unity.UnityContainerExtensions.RegisterType(Microsoft.Practices.Unity.IUnityContainer, params Microsoft.Practices.Unity.InjectionMember [])'。没有 从'RepositoryBase'到。的隐式引用转换 'IUserRepository'。
[编辑] 我改变了格奥尔格所建议的方法,并且它运作良好。
在删除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;
}
}
答案 0 :(得分:1)
错误消息是正确的。您的实现类RepsoitoryBase<T>
不会实现IUserRepository
,而只会实现其安腾程序IRepositoryBase<User>
,即使由于前者不向后者添加任何内容,它也可以提供此功能。创建此接口IUserRepository
不仅仅是IRepositoryBase<User>
的别名,而且由于.NET不允许进行鸭子输入,因此会收到此错误消息。
您可以做的只是将实例注册为IRepositoryBase<User>
而不是IUserRepository
。由于.NET具有强大的泛型,前者与例如IRepositoryBase<Payment>
完全不同,因为运行时知道泛型类型参数。