我有一个非常简单的通用存储库:
public interface IRepository<TEntity, TNotFound>
where TEntity : EntityObject
where TNotFound : TEntity, new()
{
IList<TEntity> GetAll();
TEntity With(int id);
TEntity Persist(TEntity itemToPersist);
void Delete(TEntity itemToDelete);
}
我想为类型为Term
的存储库定义一个合约而没有任何特殊行为。所以它看起来像这样:
public class TermNotFound : Term
{ public TermNotFound() : base(String.Empty, String.Empty) { } }
public interface ITermRepository : IRepository<Term, TermNotFound> { }
现在进行测试,我想创建一个通用仓库的内存实现,所以我有这个(为了简洁而没有完成):
public class InMemoryRepository<TEntity, TNotFound> : IRepository<TEntity, TNotFound>
where TEntity : EntityObject
where TNotFound : TEntity, new()
{
private IList<TEntity> _repo = new List<TEntity>();
public IList<TEntity> GetAll()
{
return this._repo;
}
public TEntity With(int id)
{
return this._repo.SingleOrDefault(i => i.Id == id) ?? new TNotFound();
}
public TEntity Persist(TEntity itemToPersist)
{
throw new NotImplementedException();
}
public void Delete(TEntity itemToDelete)
{
throw new NotImplementedException();
}
}
不难看出我希望它如何运作。对于我的测试,我希望注入通用InMemoryRepository
实现来创建我的ITermRepository
。那有多难?
好吧,我无法让StructureMap去做。我尝试在扫描程序中使用WithDefaultConventions
和ConnectImplementationsToTypesClosing(typeof(IRepository<,>))
但未成功。
有人可以帮帮我吗?
答案 0 :(得分:2)
您的InMemoryRepository
未实施ITermRepository
界面。这就是你无法连接它们的原因。
你可以做的最好的事情就是为InMemoryRepository<Term, TermNotFound>
注入IRepository<Term, TermNotFound>
。
如果您确实需要注入ITermRepository
,那么您需要继承InMemoryRepository
并实施ITermRepository
的另一个存储库类:
public class InMemoryTermRepository
: InMemoryRepository<Term, TermNotFound>, ITermRepository
{
}
现在,您可以使用以下链接ITermRepository
与InMemoryTermRepository
.For<ITermRepository>().Use<InMemoryTermRepository>()
如果您有许多接口,例如ITermRepository
,则可以创建StructureMap约定,以将I...Repository
连接到InMemory...Repository
。默认约定是将IClass
连接到Class
。