所以我跟随一篇关于在C#中使用Unity注入依赖项的教程。在本教程中,他们使用存储库类作为示例来演示该概念。试图将其应用于其中一个示例项目,我遇到了继承问题。所以我有
public interface IRepository<T> where T : class
{
List<T> GetAll();
T Get(int id);
void Add(T entity);
void SaveChanges();
}
public class Repository<T> : IRepository<T> where T : class
{
private CoffeeMachineDbContext context = null;
protected virtual DbSet<T> DbSet { get; set; }
public Repository()
{
context = new CoffeeMachineDbContext();
DbSet = context.Set<T>();
}
public Repository(CoffeeMachineDbContext context)
{
this.context = context;
}
public virtual List<T> GetAll()
{
return DbSet.ToList();
}
public virtual T Get(int id)
{
return DbSet.Find(id);
}
public virtual void Add(T entity)
{
DbSet.Add(entity);
}
public void SaveChanges()
{
context.SaveChanges();
}
}
存储库类实现接口和常用方法。 现在为了能够按照解释的那样应用依赖注入(或者至少我理解它),我创建了一个名为IClientRepository的新接口,它继承自IRepository,如下所示:
public interface IClientRepository : IRepository<Client>
{
Order GetLastOrder(int id);
}
请注意,接口声明了一个特定于客户端上下文的新方法。
最后,IClientRepository接口的实现是:
public class ClientRepository : Repository<Client>, IClientRepository
{
/// <summary>
/// Gets the client's last order
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public Order GetLastOrder(int id)
{
Order lastOrder = null;
Client client = DbSet.Find(id);
if (client != null)
{
lastOrder = client.Orders.OrderByDescending(o => o.DateCreated).FirstOrDefault();
}
return lastOrder;
}
我不需要实施IRepository方法,因为它们在所有其他方法之间是通用的。
我面临的问题是,当我尝试在统一容器中注册类型时,如下所示:
container.RegisterType<IClientRepository, ClientRepository>(new HierarchicalLifetimeManager());
我收到以下错误
类型&#39; CoffeeMachine.Models.Repositories.ClientRepository&#39;不能用作类型参数&#39; TTo&#39;在泛型类型或方法中,UnityContainerExtensions.RegisterType(IUnityContainer,LifetimeManager,params InjectionMember [])&#39;。 没有来自&#39; CoffeeMachine.Models.Repositories.ClientRepository&#39;的隐式引用转换。 to&#39; CoffeeMachine.Models.Repositories.IClientRepository&#39; 。
有谁知道我在这里做错了什么?
答案 0 :(得分:1)
发生该错误是因为您的类实际上没有实现IClientRepository
。
如果实例实际实现了该接口,则只能将实例强制转换为接口。