2012-05-30 8 views
2

У меня есть довольно простой общий репозиторий:Подключение различных реализаций с 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 для этого. Я попытался использовать WithDefaultConventions и ConnectImplementationsToTypesClosing(typeof(IRepository<,>)) в сканере без успеха.

Может кто-нибудь, пожалуйста, помогите мне?

+0

Прошло пару лет с тех пор, как я последний раз использовал SM, поэтому не собираюсь публиковать ответ, но будет ли GetNamedInstance соответствовать вашим требованиям? Я также считаю, что вы можете локально переопределить настроенное разрешение для интерфейса - не помню, где это находится в api. –

+0

Привет, Дэвид. Спасибо за ответ. Я не думаю, что «GetNamedInstance» поможет мне - я не назову экземпляры в контейнере на этом этапе. Я думаю, вы это делаете, когда у вас есть много одного и того же экземпляра для разных целей. Мне нужен только один экземпляр «ITermRepository», это просто создание его, которое заставляет меня застрять. Я думаю, что другой вариант, который вы имеете в виду, это «IRegistrationConvention», но я вижу, могу ли я избежать этого в первую очередь. –

+0

Я думал, что у вас есть одна тестовая реализация (с использованием репо в памяти) и одна производственная реализация, разве это не так? Обычно я никогда не использую мой контейнер ioc для своих тестов, предпочитая использовать проводные тестовые приборы вручную, но если вы используете контейнер, я бы сказал, что вы можете использовать именованные экземпляры для тестовой стороны вещей. –

ответ

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.

+0

Спасибо.Некоторое время назад я смотрел на интерфейсы и пришел к такому же осознанию, что и ваше вступительное заявление. Думаю, мой разум пошел по пути, который C# не мог. Спасибо, что выручил меня. –

+0

Не проблема. Рад был помочь. –

Смежные вопросы