C# 如何注册类型可变参数构造函数[Unity IoC]

C# 如何注册类型可变参数构造函数[Unity IoC],c#,entity-framework,unity-container,ioc-container,C#,Entity Framework,Unity Container,Ioc Container,在我的项目中,我有上面提到的interafe和class: public interface IRepositoryBase<T> : IDisposable where T : class { } public interface IUserRepository : IRepositoryBase<User> { } public interface IPaymentRepository : IRepositoryBase<Payment> { } publ

在我的项目中,我有上面提到的interafe和class:

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) { }
}
公共接口IRepositoryBase:IDisposable其中T:class{}
公共接口IUserRepository:IRepositoryBase{}
公共接口IPaymentRepository:IRepositoryBase{}
公共类SecurityContext:DbContext{}
公共类FinanceContext:DbContext{}
公共类RepositoryBase:IRepositoryBase,其中T:class
{
公共RepositoryBase(DbContext上下文){}
}
我正在尝试将正确的DbContext注入从IUserRepository e IPaymentRepository接口创建的对象:

  • IUserRepository->应解析为新的RepositoryBase(新的 SecurityContext())
  • IPaymentRepository->应作为新文件解析 RepositoryBase(新的FinanceContext())
我尝试了下面的代码,但没有成功:

container.RegisterType<IUserRepository, RepositoryBase<User>>(
    new InjectionConstructor(container.Resolve<SecurityContext>()));
container.RegisterType(
新的注入构造函数(container.Resolve());
。。。并得到以下错误

类型“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)));
container.RegisterType
(新的注入构造函数(typeof(SecurityContext));
最后,我不得不更改我的服务,以接收注入其构造函数中的IRepositoryBase

public class UserService : IUserService
{
    private readonly IRepositoryBase<User> _repository;

    public ColaboradorService(IRepositoryBase<User> repository)
    {
        _repository = repository;
    }
}
public类用户服务:IUserService
{
专用只读IRepositoryBase\u存储库;
公共ColaboradorService(IRepositoryBase存储库)
{
_存储库=存储库;
}
}

错误消息是正确的。您的实现类
RepsoitoryBase
不实现
IUserRepository
,而只实现其anchestor
IRepositoryBase
,即使前者没有向后者添加任何内容,它也可以提供此功能。创建此接口不仅仅是IRepositoryBase的别名,
iUserRepositoryBase
,而且由于.NET不允许duck键入,因此您会收到此错误消息


您可以做的是将实例注册为
IRepositoryBase
,而不是
IUserRepository
。由于.NET具有强大的泛型,因此前者与例如
IRepositoryBase
完全不同,因为运行时知道泛型类型参数。

听起来像是协方差/逆变问题,请尝试以下操作:Georg,谢谢!您的建议解决了转换问题,从这一点上很容易注入正确的上下文。谢谢。