[Отредактировано как первоначальные ответы, не отвечая на реальный вопрос]
Когда мне нужно сделать что-то подобное, я использую именованные экземпляры. К сожалению, я не могу придумать какой-либо простой способ сделать то, что вам нужно, без введения неуниверсального интерфейса. Неуниверсальный интерфейс будет выглядеть следующим образом (и, надеюсь, на самом деле не будет общедоступным):
public interface ILookupRepository
{
void DoSomethingWith(object lookup);
}
Заставить ILookupRepository наследовать от неуниверсального интерфейса ILookupRegistry. Затем в StructureMap 2.5.4 вы можете сделать что-то вроде этого:
For<ILookupRepository>().Add<LookupRepository<Supplier>>()
.Named(typeof(Supplier).FullName);
For<ILookupRepository>().Add<LookupRepository<Tenant>>()
.Named(typeof(Tenant).FullName);
Затем получите репозиторий поиска в вашем методе, используя
var repo = ObjectFactory.GetInstance<ILookupRepository>(lookup.GetType().FullName);
ПРИМЕЧАНИЕ. Возможно, будет лучше (если это возможно), если интерфейс ILookup предоставляет механизм для определения типа. Например. конкретный Арендатор (или все, что унаследовано от него) вернет «ITenant», что позволит использовать этот же репозиторий поиска при необходимости.
Поможет ли это сейчас?