Вот обходной путь, так как мы не могли найти более короткий способ сделать это отображение.
Во-первых, сопоставьте с открытым универсальным классом реализации, как обсуждалось в другом месте :
For(typeof(IRepository<>)).Use(typeof(ConcreteRepository<>));
Затем для каждого репозитория с пользовательским поведением добавьте методы расширения в соответствующий интерфейс. Например, предположим, что у вашего MailoutStatusRepository
есть метод GetStatus()
, вы можете перевести его в метод расширения на IRepository<MailoutStatusRepository>
:
public static Status GetStatus(this IRepository<MailoutStatusRepository> repo,
Mailout mail)
{
return mail.Status; // or whatever
}
Теперь у вас есть настраиваемое поведение репозитория, и вам не нужно беспокоиться о преобразовании вывода StructureMap в какой-то пользовательский класс:
var repo = container.GetInstance<IRepository<MailoutStatusRepository>>();
var status = repo.GetStatus(mailout);
Еще одно преимущество этого подхода заключается в том, что ваше пользовательское поведение репозитория работает независимо от реализации вашего репозитория: в тестах и в рабочем коде. Единственный недостаток (я думаю) заключается в том, что ваши репозитории обязательно не содержат состояний, но мы вообще не обнаружили в этом проблемы.