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");