我上面我的项目中interafes和类:如何注册类型的不同参数的构造函数[统一的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 e中创建的对象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'的隐式引用转换。
[编辑] 我改变了方法,因为乔治·建议和它的工作很大。
消除后,我注册的类型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