StructureMap пересылает именованные экземпляры

Я использую StructureMap 4.4.1. В моем коде у меня есть 1 конкретный класс, TransactionalDatabaseClient, что реализует ITransactionalDatabaseClient, который наследует от IDatabaseClient, Я использую Forward метод перенаправления запросов на ITransactionalDatabaseClient разрешить использование регистраций для базового интерфейса, IDatabaseClient,

Вот соответствующий раздел моего Registry:

For<IDatabaseClient>().Add(context => new TransactionalDatabaseClient(context.GetInstance<IConnectionManager>(), "sqlserver")).Named("sqlserver");
For<IDatabaseClient>().Add(context => new TransactionalDatabaseClient(context.GetInstance<IConnectionManager>(), "oracle")).Named("oracle");

Forward<IDatabaseClient, ITransactionalDatabaseClient>();

Проблема в том, что когда я запрашиваю именованный экземпляр ITransactionalDatabaseClient, StructureMap жалуется, что именованный экземпляр не существует.

Что я делаю неправильно? Есть ли обходной путь для этого?

1 ответ

Решение

К сожалению, переадресация и именованные экземпляры не работают вместе.

Когда вы запрашиваете StructureMap для именованного экземпляра, он ищет экземпляр, который был зарегистрирован специально для этого интерфейса, и не проверяет пересылку. Решение, которое работало для меня, состояло в том, чтобы просто отказаться от пересылки и зарегистрировать бетон дважды, по одному для каждого интерфейса.

Для вашей проблемы это будет выглядеть так:

For<IDatabaseClient>().Add(context => new TransactionalDatabaseClient(context.GetInstance<IConnectionManager>(), "sqlserver")).Named("sqlserver");
For<IDatabaseClient>().Add(context => new TransactionalDatabaseClient(context.GetInstance<IConnectionManager>(), "oracle")).Named("oracle");

For<ITransactionalDatabaseClient>().Add(context => new TransactionalDatabaseClient(context.GetInstance<IConnectionManager>(), "sqlserver")).Named("sqlserver");
For<ITransactionalDatabaseClient>().Add(context => new TransactionalDatabaseClient(context.GetInstance<IConnectionManager>(), "oracle")).Named("oracle");
Другие вопросы по тегам