如何注册变量参数构造函数[Unity IoC]

时间:2016-11-09 16:00:03

标签: c# entity-framework unity-container ioc-container

我的项目中有上述的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接口创建的对象中:

  • IUserRepository - &gt;应该作为新的RepositoryBase解决(新的 SecurityContext())
  • IPaymentRepository - &gt;应该像新的一样解决 RepositoryBase(new 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'。

[编辑] 我改变了格奥尔格所建议的方法,并且它运作良好。

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

1 个答案:

答案 0 :(得分:1)

错误消息是正确的。您的实现类RepsoitoryBase<T>不会实现IUserRepository,而只会实现其安腾程序IRepositoryBase<User>,即使由于前者不向后者添加任何内容,它也可以提供此功能。创建此接口IUserRepository不仅仅是IRepositoryBase<User>的别名,而且由于.NET不允许进行鸭子输入,因此会收到此错误消息。

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