使用通用存储库

时间:2016-11-28 15:03:43

标签: c# generics dependency-injection simple-injector

使用我的通用存储库实现SimpleInjector时遇到了一些问题。

我有一个接口IRepository<T> where T : class和一个实现接口的抽象类abstract class Repository<C, T> : IRepository<T> where T : class where C : DbContext。最后,我有我的实体存储库,它继承了抽象类。这是一个具体的例子:

public interface IRepository<T> where T : class
{
    IQueryable<T> GetAll();
    IQueryable<T> FindBy(Expression<Func<T, bool>> predicate);
    void Add(T entity);
    void Remove(T entity);
}


public abstract class Repository<C, T> : IRepository<T> 
    where T : class where C : DbContext, new()
{
    private C _context = new C();
    public C Context
    {
        get { return _context; }
        set { _context = value; }
    }
    public virtual IQueryable<T> GetAll()
    {
        IQueryable<T> query = _context.Set<T>();
        return query;
    }
    ...
}

public class PortalRepository : Repository<SequoiaEntities, Portal>
{
}

在我的global.asax.cs文件中,在Application_Start()函数下,我添加了:

Container container = new Container();
container.Register<IRepository<Portal>, Repository<SequoiaEntities, Portal>>();
container.Verify();

当我启动项目时,Simple Injector尝试验证容器,我收到错误:

  

附加信息:给定类型Repository<SequoiaEntities, Portal>不是具体类型。请使用其他一个重载来注册此类型。

有没有办法用泛型类实现Simple Injector,或者我必须通过特定的类?

1 个答案:

答案 0 :(得分:3)

Register<TService, TImpementation>()方法允许您指定在请求指定服务(TImplementation)时由Simple Injector创建的具体类型(TService)。但是,指定的实现Repository<SequoiaEntities, Portal>标记为abstract。这不允许Simple Injector创建它;无法创建抽象类。 CLR不允许这样做。

你确实有一个具体的类型PortalRepository,我相信你的目标是返回那种类型。因此,您的配置应如下所示:

container.Register<IRepository<Portal>, PortalRepository>();

或者,您可以使用Simple Injector的批量注册工具,并在一次调用中注册所有存储库:

Assembly[] assemblies = new[] { typeof(PortalRepository).Assembly };

container.Register(typeof(IRepository<>), assemblies);