gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:37:08 24 4
gpt4 key购买 nike

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

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 注入(inject)到从 IUserRepository e IPaymentRepository 接口(interface)创建的对象中:

  • IUserRepository -> 应该解析为 new RepositoryBase(new安全上下文())
  • IPaymentRepository -> 应该被解析为新的RepositoryBase(new FinanceContext())

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

container.RegisterType<IUserRepository, RepositoryBase<User>>(
new InjectionConstructor(container.Resolve<SecurityContext>()));

...并得到以下错误

The type 'RepositoryBase' cannot be used as type parameter 'TTo' in the generic type or method 'Microsoft.Practices.Unity.UnityContainerExtensions.RegisterType(Microsoft.Practices.Unity.IUnityContainer, params Microsoft.Practices.Unity.InjectionMember[])'. There is no implicit reference conversion from 'RepositoryBase' to 'IUserRepository'.

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

删除 IUserRepository 和 IPaymentRepository 接口(interface)后,我注册了如下类型:

    container.RegisterType<IRepositoryBase<User>, RepositoryBase<User>>
(new InjectionConstructor(typeof(SecurityContext)));

最后,我不得不更改我的服务以接收在其构造函数中注入(inject)的 IRepositoryBase。

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

public ColaboradorService(IRepositoryBase<User> repository)
{
_repository = repository;
}
}

最佳答案

错误信息是正确的。你的实现类 RepsoitoryBase<T>不执行 IUserRepository但只有它的祖先IRepositoryBase<User> ,即使前者没有向后者添加任何内容,它也可以提供此功能。创建此界面 IUserRepository不仅仅是 IRepositoryBase<User> 的别名由于 .NET 不允许 duck typing,因此您会收到此错误消息。

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

关于c# - 如何注册类型不同的参数构造函数[Unity IoC],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40511144/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com