如何注册不同类型的参数构造函数[Unity IoC]

本文关键字:构造函数 参数 Unity IoC 同类型 何注册 注册 | 更新日期: 2023-09-27 18:17:03

我的项目中有上面的接口和类:

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 ->应该解析为new RepositoryBase(newSecurityContext ())
  • IPaymentRepository ->应该解析为newRepositoryBase(新FinanceContext ())

我尝试了下面的代码,没有成功:

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"。

[编辑]我按照Georg的建议改变了方法,效果很好。

在删除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;
    }
}

如何注册不同类型的参数构造函数[Unity IoC]

错误信息正确。您的实现类RepsoitoryBase<T>不实现IUserRepository,而只实现它的锚点IRepositoryBase<User>,尽管由于前者没有向后者添加任何内容,它可以提供此功能。创建这个接口IUserRepository不仅仅是IRepositoryBase<User>的别名,而且由于。net不允许duck类型,您会得到这个错误消息。

您可以做的是简单地将实例注册为IRepositoryBase<User>而不是IUserRepository。由于。net具有强大的泛型,因此前者与IRepositoryBase<Payment>完全不同,因为运行时知道泛型类型参数。