У меня есть довольно простой общий репозиторий:Подключение различных реализаций с 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<,>))
в сканере без успеха.
Может кто-нибудь, пожалуйста, помогите мне?
Прошло пару лет с тех пор, как я последний раз использовал SM, поэтому не собираюсь публиковать ответ, но будет ли GetNamedInstance соответствовать вашим требованиям? Я также считаю, что вы можете локально переопределить настроенное разрешение для интерфейса - не помню, где это находится в api. –
Привет, Дэвид. Спасибо за ответ. Я не думаю, что «GetNamedInstance» поможет мне - я не назову экземпляры в контейнере на этом этапе. Я думаю, вы это делаете, когда у вас есть много одного и того же экземпляра для разных целей. Мне нужен только один экземпляр «ITermRepository», это просто создание его, которое заставляет меня застрять. Я думаю, что другой вариант, который вы имеете в виду, это «IRegistrationConvention», но я вижу, могу ли я избежать этого в первую очередь. –
Я думал, что у вас есть одна тестовая реализация (с использованием репо в памяти) и одна производственная реализация, разве это не так? Обычно я никогда не использую мой контейнер ioc для своих тестов, предпочитая использовать проводные тестовые приборы вручную, но если вы используете контейнер, я бы сказал, что вы можете использовать именованные экземпляры для тестовой стороны вещей. –