2

私は非常に単純な汎用リポジトリを持っています:

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<,>))

誰かが私を助けてくれますか?

4

1 に答える 1

2

インターフェイスInMemoryRepositoryを実装していません。ITermRepositoryそのため、それらを接続することはできません。

あなたが持っているものでできる最善のことは、注射することInMemoryRepository<Term, TermNotFound>ですIRepository<Term, TermNotFound>.

本当に を注入する必要がある場合は、 を継承して実装ITermRepositoryする別のリポジトリ クラスが必要になります。InMemoryRepositoryITermRepository

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

ITermRepositoryこれで、次をInMemoryTermRepository使用して接続できます。

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

のようなインターフェースが多数ある場合はITermRepository、StructureMap 規則を作成して に接続できI...RepositoryますInMemory...Repository。デフォルトの規則は、に接続するIClassことClassです。

于 2012-05-31T02:47:20.650 に答える