首页 > 解决方案 > Autofac注册通用存储库,其中T不是类

问题描述

我在尝试解析用于数据库访问的通用存储库时遇到了一个问题。当我将这两个用作存储库实现/接口时,我无法解决例如IRepository<ICustomer>

界面:

public interface IRepository<T> where T : IDbModel
{ ... }

执行:

public class Repository<T> : IRepository<T> where T : DbModel
{ ... }

但是,当我在这两种情况下替换IDbModelDbModel使用class时,它都按预期工作。

我的注册看起来像这样:

builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>));
builder.RegisterType<DbModel>().As<IDbModel>();
builder.RegisterType<Customer>().As<ICustomer>();

为了完整起见,这里是ICustomer

public interface ICustomer : IDbModel
{ ... }

Customer: _

public class Customer : DbModel, ICustomer
{ ... }

IDbModel: _

public interface IDbModel
{ ... }

并且DbModel(我在删除时检查了它是否有效,abstract但没有):

public abstract class DbModel : IDbModel
{ ... }

我想知道是否有可能让我的第一次尝试以某种方式工作?

标签: c#genericsautofac

解决方案


通过要求Autofac解决IRepository<ICustomer>,它将尝试解决Repository<ICustomer>并且ICustomer不是DbModel

要修复错误,您应该将类​​类型约束替换为IRepository<TModel>接口类型约束。

 public class Repository<T> : IRepository<T> 
    where T : IDbModel 
 { }

推荐阅读