使用我的通用存储库实现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,或者我必须通过特定的类?
答案 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);