使用StructureMap连接不同的实现

时间:2012-05-30 08:48:45

标签: c# generics interface repository structuremap

我有一个非常简单的通用存储库:

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去做。我尝试在扫描程序中使用WithDefaultConventionsConnectImplementationsToTypesClosing(typeof(IRepository<,>))但未成功。

有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:2)

您的InMemoryRepository未实施ITermRepository界面。这就是你无法连接它们的原因。

你可以做的最好的事情就是为InMemoryRepository<Term, TermNotFound>注入IRepository<Term, TermNotFound>

如果您确实需要注入ITermRepository,那么您需要继承InMemoryRepository并实施ITermRepository的另一个存储库类:

public class InMemoryTermRepository 
    : InMemoryRepository<Term, TermNotFound>, ITermRepository
{
}

现在,您可以使用以下链接ITermRepositoryInMemoryTermRepository

.For<ITermRepository>().Use<InMemoryTermRepository>()

如果您有许多接口,例如ITermRepository,则可以创建StructureMap约定,以将I...Repository连接到InMemory...Repository。默认约定是将IClass连接到Class