使用 StructureMap 连接不同的实现

问题描述 投票:0回答:1

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

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<,>))
但没有成功。接下来我可以尝试什么?

c# generics interface repository structuremap
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.