2016-11-09 52 views
2

我上面我的项目中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; 
    } 
} 
+0

听起来像一个协变/逆变问题,试试这个:http://tomasp.net/blog/variance-explained.aspx/ – Charleh

回答

1

错误消息是正确的。您的实现类RepsoitoryBase<T>不会实现IUserRepository,但只有其管理员IRepositoryBase<User>,即使由于前者不向后者添加任何内容,它可以提供此功能。创建此接口IUserRepository不仅仅是IRepositoryBase<User>的别名,并且由于.NET不允许鸭子打字,所以您会收到此错误消息。

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

+0

Georg,谢谢!你的建议解决了转换问题,从这一点很容易注入正确的上下文。谢谢。 –

相关问题